获得本站免费赞助空间请点这里
返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 1 ^9 Z% Z) a, P/ {* p; c( _

7 w; R7 Z- ^+ N+ z有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
4 n# ^( A8 n3 _/ R 7 c5 X4 z: h0 M5 J
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
" p/ W' O: H" u, k" R 1 A; T5 s' J* m2 i$ V* }& t; v
# d9 I# T% x5 y4 W2 `8 ^/ U9 V( a. V
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
: a: {2 o! M  A5 n, v+ h
; }  a' h  W  f! b! u$ UUSE AdventureWorks ;
8 Y" P& s) F- l0 a! H3 {- _3 iGO% e2 T$ i6 _& ], l7 s" _  J0 g+ {5 i
SELECT DISTINCT c.LastName, c.FirstName
# a8 S! A- f$ h% f+ _- e6 o, g$ RFROM Person.Contact c JOIN HumanResources.Employee e% I/ e8 S% }* e4 h8 ~
ON e.ContactID = c.ContactID WHERE EmployeeID IN 8 Z0 B8 Y3 F& Y3 m( f2 ], C
(SELECT SalesPersonID 5 g* _1 b! D, F/ z5 v+ @. t
FROM Sales.SalesOrderHeader
( t- m' V% I/ \WHERE SalesOrderID IN
* p9 X/ T# y  e: ^# S( y) E5 ]0 l* D; \(SELECT SalesOrderID
/ E8 r( I% \* J1 V" D- z) RFROM Sales.SalesOrderDetail
5 e/ n0 y- ?2 v7 @9 LWHERE ProductID IN
) O& D: A, n- R(SELECT ProductID 3 c2 a) S# X2 {. Y0 N7 U

+ i& s+ x" I% pFROM Production.Product p
% q- V1 l- V; G1 YWHERE ProductNumber LIKE'FW%')));) I$ o% I9 m4 P# z) ]( o/ ~
GO
% t7 p7 D4 F( ?9 d8 |
& z& o, a# T" O4 ]% t6 @0 `3 J9 L$ K; {
9 N' i+ @2 {% ]- T8 J! d
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
. t- Y+ }+ `2 y$ W1 X7 o ; J* y! f0 N9 u7 C  E

8 F2 {5 ]# [1 `* w1 a" o: L我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 - D0 t3 l9 t" H& J: Y( [, l$ F6 D
  y: d) b9 Q& y7 m: m
  ^* U# Z! E/ m9 W  P& e
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。+ m% {9 `5 e2 j" W
89w.org捌玖网络

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