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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 ' A* n1 x; e0 m( k/ N
4 @. v# _' u. y6 I5 e, o4 R
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ; E2 r9 }* O- k5 |+ {! A. L
( f- a* V' I& |$ k0 r& g$ h- r
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
* O: y5 W; T' h5 k. }) g
; o$ N* w3 m0 P3 n/ k! N( s* f* k
( ^) U: M$ A& r. x, C8 D; K9 M如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 6 r2 g2 |" x7 N
! t# J) s' [1 {% n( |
USE AdventureWorks ;
6 E' e0 p7 F' T/ Z- P! ]GO1 _0 c0 U8 ]) S9 @
SELECT DISTINCT c.LastName, c.FirstName
. h( y1 P! X  e& Q: R5 a0 AFROM Person.Contact c JOIN HumanResources.Employee e5 ?( |3 F/ E/ v4 I+ T% X, a% M7 n
ON e.ContactID = c.ContactID WHERE EmployeeID IN * B* {- T6 y8 e0 R. @
(SELECT SalesPersonID
: u! I4 b  a: t& cFROM Sales.SalesOrderHeader# V5 D' L3 Y' o9 x& z  E
WHERE SalesOrderID IN
2 U5 \0 M% A/ U8 E, q0 ]0 V" s(SELECT SalesOrderID
8 I5 ~& S5 H0 G- Y: oFROM Sales.SalesOrderDetail6 `/ o: Y/ Z6 Y/ E
WHERE ProductID IN ' T6 N) h) [% J8 r% ?; e
(SELECT ProductID
$ [( U5 Z1 W+ X; b
% J2 Y& I8 O9 zFROM Production.Product p 5 \2 T! a* q$ P2 o
WHERE ProductNumber LIKE'FW%')));
1 w: a- s4 q$ L' |" uGO
: y6 w, k# B6 b2 {( Z
7 G; O0 y  r1 P4 K9 o! ?, d* O* _8 \1 @
/ e" @9 C/ A4 e; P" y: z4 d# f& T0 O6 f
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
8 j5 b4 `# u$ B- f' V! t) A
4 ^1 k) ~/ T4 d% O
3 N0 ]; c2 U" w, G/ X9 N我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ' z" z2 N. i& \. M/ G) Q" v9 Q5 h

1 B9 r9 |- l4 k) v, l 7 J0 R2 K# T- w* `8 k
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
/ g% P8 a/ e/ a* V+ Z3 q8 m
89w.org捌玖网络

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