返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
' n" w7 y3 v1 g2 @9 {! Q / M( l0 h8 `. x
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ! L1 m( n% E, j+ o! V
6 P7 m1 ?4 N5 N! Q
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 7 V% O! _% c- e$ D
) l5 s% w# o; E( j. p) J
% y7 @/ Q: n3 N* T  k1 e  P
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ) g  T1 a, h7 k1 P8 L! S
( x0 j5 c1 O6 O* j
USE AdventureWorks ;% g( N. t: F/ |% y- S' @
GO
8 a% C2 C) {0 G" d' o6 JSELECT DISTINCT c.LastName, c.FirstName & G  h2 _: k6 @( q% O) F
FROM Person.Contact c JOIN HumanResources.Employee e
5 ^, |# }7 ?+ M& r: ~& w$ J+ uON e.ContactID = c.ContactID WHERE EmployeeID IN & F2 J3 u& N9 @& g7 I
(SELECT SalesPersonID
0 b: \6 ?" q* u6 Y, x# bFROM Sales.SalesOrderHeader& Q5 D& R; {' f% Q, q; o
WHERE SalesOrderID IN ' r. V1 D' A' U, l2 X/ @: M
(SELECT SalesOrderID / o% v8 O( H1 K: ?5 D: }/ O
FROM Sales.SalesOrderDetail
( Z% H" ^, g8 Y$ x6 i9 U) JWHERE ProductID IN
9 D# W1 y" Q+ V. O4 Y(SELECT ProductID
' S* N7 i' H/ T3 q' A5 r
' N& Z6 Q7 J9 O2 E7 dFROM Production.Product p " o% d+ D! V8 N2 s+ R0 T
WHERE ProductNumber LIKE'FW%')));
* K4 O" p' q3 T% hGO! q8 O& ?5 L4 o) G! O7 G6 x9 a
' F, A) x% D% u

% K) q; P# Q9 t* }. o 1 j; S$ l2 @- |6 U. P% \
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
' i( S! c+ @' {9 g  H. K' ~/ a
$ n7 C' D) V0 `; e
3 V) r, D4 Y8 u, a5 q我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
4 Y. |3 k% r* P5 c. \2 j
7 v5 i3 g4 ]  R  ]) ^" P
: a2 e" p! n3 ?7 B3 `# y( g在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
0 ]2 C! r. q% H' Y# B9 F
89w.org捌玖网络

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