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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
4 a: x- _! b4 O' T0 ]. e3 b# J0 B
1 e: q8 j8 b- B7 i' n) _( t有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
, Q8 u3 v; s* q6 X
& i/ m4 y, w7 G! z& f试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 5 W2 n: x# n2 F" w

- a% a! F6 E5 ?' \- x- M( q
" x1 a  G; L) q如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 # O' z- Y! P1 {
" z! I, V# ]' J" T' r
USE AdventureWorks ;
8 N/ y. q( u# z% p; XGO. h$ L) v) O+ [1 k6 M! V
SELECT DISTINCT c.LastName, c.FirstName
! X+ |; {5 y5 H1 x9 ]1 KFROM Person.Contact c JOIN HumanResources.Employee e) R, L& l/ D: C
ON e.ContactID = c.ContactID WHERE EmployeeID IN
1 @3 r* i  U! \) B5 t7 s(SELECT SalesPersonID
3 i, M; d3 }8 ^: f* j1 nFROM Sales.SalesOrderHeader( |  x" o# i. i6 f/ M% M
WHERE SalesOrderID IN
/ M5 \: ~$ E* m; ~% a. |(SELECT SalesOrderID ' N) J0 p' t3 {, m$ r
FROM Sales.SalesOrderDetail/ ^6 p) e+ R$ z7 @# N3 N
WHERE ProductID IN
4 c/ ]- ~  \8 {(SELECT ProductID ( u1 C. w; r# {* s. B9 ~( }- W' s

+ [% N- I: O$ H& KFROM Production.Product p ; p4 h& z& O! B" w
WHERE ProductNumber LIKE'FW%')));6 @4 Q- k1 q  _& [  w8 [, z. P0 [
GO
# Z" B; y2 `- d% H
/ a; m4 T1 i/ B" r  E4 U5 L( R+ _2 e6 {" ]' v. u

; `) i' i1 \' N! t- E5 M这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
8 I% |* z+ V$ `$ K 7 ~& R% l  t4 \3 f, R" N" i
2 j' c2 z3 f4 ^3 |. o% j6 W$ H9 N
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
/ k: @: o9 J( e( Z# r8 x: X; y % B- r: V  p! x3 }1 w9 ]

) `: |4 [( w4 l在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
5 N2 o6 ]; z+ \9 @1 s
89w.org捌玖网络

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