返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 0 H! m" x) p5 {, d2 {' u" j
6 k9 p! w% |% Z) ~( r7 k
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
8 B8 p1 B" q# o
! y/ F3 u% b8 b试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
/ O* H, ]; R* r, l7 }6 E6 x3 B
2 w9 \& D9 C; T/ j9 ?0 E, L
% n/ L; i4 W* B* P2 ^如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
; f2 A2 W' o" i+ H* _ & V3 o+ I6 P2 C$ |  l
USE AdventureWorks ;
8 R1 Q2 H6 X6 AGO
+ z+ Y6 p* e' {- u* ~$ o+ ?+ mSELECT DISTINCT c.LastName, c.FirstName
8 G# D% {1 G6 Z) {) W& DFROM Person.Contact c JOIN HumanResources.Employee e
& D" B9 n  M# `' {$ x" NON e.ContactID = c.ContactID WHERE EmployeeID IN
; D8 `5 B+ u# A6 |' Z4 `(SELECT SalesPersonID 3 w# J# A* Q' b, D3 ?$ Q+ l
FROM Sales.SalesOrderHeader
5 E9 Z7 w. ?: ]' G6 R3 S, d; DWHERE SalesOrderID IN ) ^9 v4 k' B, z* |2 I$ r  M4 \* T
(SELECT SalesOrderID 8 S' T- R) P# q( y, C% W5 ?
FROM Sales.SalesOrderDetail
, b. O9 X3 x  H  F8 x5 vWHERE ProductID IN
& f0 M" @5 Q' _1 y- S: t(SELECT ProductID
+ |' y4 T3 q1 G/ Y3 B9 P
2 Q5 z! F3 y# u- g% ]) c( Q, |FROM Production.Product p 3 t: G" P+ z* u
WHERE ProductNumber LIKE'FW%')));
/ T  P# V' `  p% U2 NGO; b0 u5 F* _& w. e' \9 d$ R
5 B% @; z- f) ~8 e, O5 f* Y' W3 x

% r. @$ l! l" `2 G( }5 ]& \ " m3 `/ a% n$ A+ V$ M! C$ ~8 V5 v
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 : o6 b0 r6 Y! C8 S4 _0 y4 ^/ x. o

3 A& B2 i, S- z# o- P2 | + `5 D8 N  P( l" T4 s: X
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。   u. p% [. \' h, E, _, U8 U/ p

, J, K% C% X+ _$ T0 f 4 z/ W, b! m" n  ]5 l
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。6 A4 q$ k0 k- n
89w.org捌玖网络

返回列表
【捌玖网络】已经运行: