|
  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 $ v+ g$ A# i& p* K( s
: d; ?# ^& R+ l& X" a
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 " I& e- }3 E& E9 }- r
. J' ?2 }" _5 ~& E1 W
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
5 R$ G7 e5 U5 ]. Z$ R# I, E: V$ r 2 Y+ i- j6 C2 [% p; i0 @" z, c
, s: s5 H9 F# p( z9 _* ^! I( O
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
; I" ?5 H' ~, U- [2 h7 T! M, w - Z% V; i; j- q/ ]# W- q
USE AdventureWorks ; \( Z1 }( c& G/ ? t
GO( \1 G: F3 N3 r3 S+ T9 s* T+ z* y
SELECT DISTINCT c.LastName, c.FirstName
: N, G2 ]7 C2 s$ t1 \FROM Person.Contact c JOIN HumanResources.Employee e
7 n+ }9 S' M9 E% J" t6 e. QON e.ContactID = c.ContactID WHERE EmployeeID IN , G( T) G$ w& L' ^# O
(SELECT SalesPersonID 8 I" v4 A0 g Y& f! ]1 }% ~) c
FROM Sales.SalesOrderHeader7 M, F. c& A1 W: B# I5 N4 ]
WHERE SalesOrderID IN
' Y, S4 z* s( u% {/ V; d(SELECT SalesOrderID
( J1 r& [; m" }: T# fFROM Sales.SalesOrderDetail
3 z5 Y- b3 h3 lWHERE ProductID IN
. \$ i, q0 u* _& ?0 Y1 X* s(SELECT ProductID 0 N4 n% ~' ?! G1 @ M9 a
, O% C/ V8 n) K0 N% I8 M+ x' CFROM Production.Product p
5 A& Z3 k; a) H8 EWHERE ProductNumber LIKE'FW%')));
/ |6 {$ o% [- P* MGO: W6 x1 ^8 T6 ?9 v% R
+ Q s2 ^& }) y$ g% S
8 |& b& Y5 K/ c( N3 B' w( b
3 u: o4 K7 ^3 G% d& v. [1 K这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 * k7 U; a. x3 e
% n- |0 B! |* b9 @- y
2 z& L9 z* d( T0 T" m我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ! T2 ]) j5 V# F
" Q' {, M; e" T9 w/ ~7 E - ?" ?+ ~. D/ A9 Y& R
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
( ?- s& N& K- _. j |
|