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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
4 M0 \9 N4 O- r9 ^+ L7 \
4 K1 a8 ?- Z4 Q% T9 r有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 , m. v2 n  J1 r

5 J2 H1 d  m. k# W' Y试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ) `( S6 ~3 ^. O: o3 k* a
$ i& {+ A2 e1 a( s% f7 Q
6 h; |6 f+ M/ S  `+ e5 y
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 . ?+ ~- t9 j4 ^2 W$ a2 H* I# `
. d; v3 q, c8 V8 y- A, B
USE AdventureWorks ;
( E. A5 M* w" l8 @GO
/ |9 z; D5 r  R. n7 c2 YSELECT DISTINCT c.LastName, c.FirstName $ n+ N* Q$ K9 l% P
FROM Person.Contact c JOIN HumanResources.Employee e% t" n- M5 J& o( X0 y
ON e.ContactID = c.ContactID WHERE EmployeeID IN . E* _3 d+ X; _: R! d! ]( O
(SELECT SalesPersonID   S1 w3 g1 E0 J; I
FROM Sales.SalesOrderHeader& F' {; y; i; z- e( H3 @
WHERE SalesOrderID IN
- U' H0 ^0 \* U: y3 y. V. m* ^+ y(SELECT SalesOrderID 9 |4 r* _4 z5 M& J8 V( q
FROM Sales.SalesOrderDetail
0 U" E. U0 I& i1 |8 [$ ~% tWHERE ProductID IN % ]2 Q3 N/ F9 H! l; @
(SELECT ProductID $ K, B6 n4 A6 A

9 }' C" Y, Z& c/ }FROM Production.Product p # ^$ J: H2 J2 J5 G% N
WHERE ProductNumber LIKE'FW%')));8 P5 [* C0 ?3 e* ~1 Y/ u
GO) q2 W5 g- b# v* m* |7 q# A
* p; \# U6 d9 ?. }2 A! }" c! X
' E7 ]8 d( P6 }. u6 W

$ i; m; j  i: R! @; l9 \& K这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
" W& O. N; R  ?
1 D3 O3 _# A# N" @0 x+ C ; p5 K. j, m: F$ i9 J$ C
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
$ ~  c: ^" S, W& d. Z3 J& n
+ p* e' W3 Z. p& o" ]  M) W+ C 5 y  P; S; s; K+ I: @2 F
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
8 F. ]' D: _! s2 o: m3 k
89w.org捌玖网络

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