|
  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
7 f, q* h- }' y
. L. k: F* Z- D有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ; K h8 d9 q9 c* Z- X8 V5 ~* m. b; f
/ F; F ~' e! ]1 u
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 " F" {9 r. a) E9 ^. R1 z
4 R- d5 g8 d, A/ i; Y
0 p# J* f3 N, ]# h( h9 b如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 - q6 M' m; k8 }1 K8 F
4 V2 S8 u; ?0 p, MUSE AdventureWorks ;
+ q) x4 R; K- O8 V; E6 `. KGO) z+ D4 ]( z9 l+ T5 @% e3 V+ P4 U
SELECT DISTINCT c.LastName, c.FirstName
, h) @1 J% ^" P( e3 @FROM Person.Contact c JOIN HumanResources.Employee e
6 F9 t# ^2 {/ xON e.ContactID = c.ContactID WHERE EmployeeID IN + y# T% Y G) Y3 K- d7 N
(SELECT SalesPersonID ' D+ Y2 _" |; m1 X" X* q! h
FROM Sales.SalesOrderHeader4 @& g/ z1 B& A; q7 E1 ]1 u
WHERE SalesOrderID IN 9 Y' v3 z W8 G4 _" i
(SELECT SalesOrderID / F& v8 y) F G2 F- F0 F
FROM Sales.SalesOrderDetail7 }4 u k) H, o: K. p
WHERE ProductID IN
5 U/ t6 F+ X5 R$ h# D+ | \/ I(SELECT ProductID * z9 _) C9 u( q( U2 R
- H8 _; H1 w6 V- c- U' h
FROM Production.Product p
8 ~4 s6 V. C1 Z* [WHERE ProductNumber LIKE'FW%')));/ K! d5 o. [8 J; R6 b
GO
3 H, {" O! H+ j3 P, _! B9 H
9 C p0 A% S1 t1 i0 F- S4 Y
" H! b% ~' R: f, D* H. L & X( ]* q" [* k$ X) v+ c1 T
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 9 j* U1 R8 _+ j- ]# I
8 C' ~: o3 `) X% ^6 ?7 d1 f# m7 M& y
) k0 y. r: r, \我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 4 B& ~3 [3 P0 A. ^6 m6 Q9 r4 S
8 h( A7 ?9 J, K
) z8 {+ r3 q3 M5 T0 V! U3 {
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。0 @5 }+ O, z) M
|
|