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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
- v+ b: M8 {, L. Q0 L" z 0 c1 f" u8 v' ~6 h3 a: |5 Q5 D5 K, ]
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 0 K5 ~) Q. V$ G& A. _$ W

8 T* `" e8 v* F7 e/ K% H1 x试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 8 C( Y9 W* u+ q) w

+ g) G4 K7 h' \. k5 T( g / f) R9 t# h. I# ^0 @
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 3 v- a. ]& S5 t* @" j' V
5 u3 n6 a6 C! I% m( y4 X
USE AdventureWorks ;
4 `+ x8 _5 K9 O2 V: jGO
9 O" \" p; @6 s' b$ |) VSELECT DISTINCT c.LastName, c.FirstName
: A9 U- S$ e' I" m' K% ZFROM Person.Contact c JOIN HumanResources.Employee e$ {/ |0 S) E# w/ e0 A( A; Q
ON e.ContactID = c.ContactID WHERE EmployeeID IN 8 H3 b) M4 N0 Z, i" |3 s
(SELECT SalesPersonID
' Y4 I! Q# Z  _" b$ FFROM Sales.SalesOrderHeader
8 s$ q  `; e7 R# |7 EWHERE SalesOrderID IN 9 A3 k! M  o+ U5 `
(SELECT SalesOrderID
. v2 X1 n1 i7 }& x, \( QFROM Sales.SalesOrderDetail
2 U; W+ {7 a0 _  ~  YWHERE ProductID IN
2 w: O1 D9 Y- N$ O% o7 I9 p(SELECT ProductID
- p$ M; g' n3 B* E: @. b
/ p3 o& v& j3 LFROM Production.Product p
0 O" |* w9 S$ F% K! QWHERE ProductNumber LIKE'FW%')));
% Q# \5 E& L% T4 w2 s5 z$ FGO+ j3 ]1 ~8 G' u7 i

+ j3 G2 R2 D& W+ A  U" _0 A$ ?3 P5 d* d+ K: U1 D% |; y

7 `/ t1 K: m% _0 M: z2 u5 c这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 7 B& L7 d) M  E4 ~1 J
  j& }2 S8 v2 d& Z9 u
% p3 O" r" B' w  r% C
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 * |/ q1 G2 E: [0 U/ ?
% o2 M6 R/ G. y* G0 N$ n9 q

- E7 k  t# o+ O5 A3 t在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。! }1 M# c$ e4 h/ n7 m# d
89w.org捌玖网络

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