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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 / z4 n6 {+ p" p, d4 j0 x
6 m- \/ n3 _+ {5 l
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
4 V9 y3 d  {* K/ N1 z 3 r/ P4 L1 y% C3 M
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 * }0 d3 j1 ]% [7 C7 _1 K
' I. N  }0 f7 s, B' `8 w8 b

4 d* U9 ]2 f; g/ u1 j7 W如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 . @+ v/ f. S0 K; O- P' x

4 T8 S( e8 A" @  [5 k' w8 PUSE AdventureWorks ;
1 h5 _. u# n# R1 Z" rGO& K+ @/ U, p* ]
SELECT DISTINCT c.LastName, c.FirstName ' ?) B9 U& Y# F3 B" l  Q" W+ V; P
FROM Person.Contact c JOIN HumanResources.Employee e* {. m) U% l7 G* [* M
ON e.ContactID = c.ContactID WHERE EmployeeID IN & Z. Z1 B# M  X/ l. [  @3 w
(SELECT SalesPersonID
  [$ i0 m6 `0 m6 R5 MFROM Sales.SalesOrderHeader5 ?+ u0 h! l9 `3 Z: D2 K0 H
WHERE SalesOrderID IN ; ~7 U+ s0 A/ J
(SELECT SalesOrderID - _6 ~! n" p& D# V1 V( n0 \0 l
FROM Sales.SalesOrderDetail$ |) _: M! j+ z8 C2 a5 w+ K! B
WHERE ProductID IN # w5 `% _, \' b) n2 F+ D
(SELECT ProductID
. l4 k9 v) `) P' g8 D8 e5 C# @5 m( X6 v; z0 {. g! Y9 H% U$ [1 N1 `( s
FROM Production.Product p + b+ y# F) k) G
WHERE ProductNumber LIKE'FW%')));3 Y2 B9 a5 }" M& y9 Y1 b0 J$ A
GO, I' q# g6 b) |3 X) K

1 w4 D( a" e9 a
) p% M% D/ {; ?4 a6 U 2 B9 \# ?4 E. E, X6 h
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ) k/ E1 ^$ {7 A& |
. d  T) C$ Q! ^$ \) V1 i

) J) S' j0 Z- G3 Q4 e我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ; z+ ]9 w; m) v
' `* X( s3 i. z" b: P9 k
# A9 G, ~* k3 p* _: @/ _1 L! T
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
+ j6 \$ F! S8 j
89w.org捌玖网络

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