  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
/ p3 d" D6 i8 B 2 S, W, A. e" A' H
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
$ l2 k9 \: U- F1 m, b- L- Y- h
; P/ W. i9 p3 S6 |1 r' h6 x试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 * s. J( K' [% A" d3 c
7 B7 S- g6 K/ x( c
/ }0 |0 n2 s F4 p4 Z+ n, p
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
& G5 Q. R6 y' ~' f+ g4 \8 u
) J% V7 P* m! X. AUSE AdventureWorks ;
, U3 K- d3 g$ B" YGO, D/ o& T: l$ x; K! m! V% V
SELECT DISTINCT c.LastName, c.FirstName
3 d- ~5 K0 C* L$ y2 N5 ^: XFROM Person.Contact c JOIN HumanResources.Employee e
6 _0 J7 S: ~, \& nON e.ContactID = c.ContactID WHERE EmployeeID IN
& l7 L: N9 h9 N' d& u! X* R: E(SELECT SalesPersonID
" Y. [0 S" [5 H9 RFROM Sales.SalesOrderHeader& B! {' z: m+ s( M
WHERE SalesOrderID IN & J$ y7 L2 l; M
(SELECT SalesOrderID 5 i7 u( P9 g/ F2 }1 x; N! x
FROM Sales.SalesOrderDetail* w! A" G1 ^; }" s$ }9 T, l
WHERE ProductID IN
$ w# r1 \- R7 ~0 x(SELECT ProductID
" \) X9 Q" r. j1 |- a9 }0 F+ M9 h% i8 Y1 e' b8 Z! ?$ p' C3 C
FROM Production.Product p
. K- F6 {8 L. x w9 l% lWHERE ProductNumber LIKE'FW%')));
$ U9 `' R3 T& I2 _GO
% x! i* p' q2 T( T6 j, U3 }' L+ `0 j P
/ c, s2 H3 @: q* j
`; i7 [8 m( @" Y8 a这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
( [8 `/ f5 b; ~# i+ x( \1 s; x 9 b* u8 N$ ]5 Q6 n2 g' L% b- w
: Q! }7 N5 B& N3 O我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 , }! F! v0 l- c: E9 ]" |9 z
2 h# X& }' R6 Z( n
1 |1 `8 J$ R% E4 x+ \( \在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。. o0 n6 X1 k+ h D
|
|