|
  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
]; i3 y3 n' q1 ]6 I ; b, T U2 {' _6 [$ j# o9 _
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 9 {. E# b% M2 `& c+ D# F; D
/ h8 m) U# r3 U. n2 U x% A4 i试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 1 V& c+ l, @$ M h/ C$ G
* Y+ E3 J& x# ^5 h
( U* h+ p& b z3 N( S1 |如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ! H+ q* e! I. a5 n( M; n
" F' X1 J1 n# |8 I: V$ D+ bUSE AdventureWorks ;
) k3 c# q& O4 U# `! ]6 iGO
- m- j' D8 {. c' @SELECT DISTINCT c.LastName, c.FirstName
- [4 y- y7 ^7 I/ w* a0 {FROM Person.Contact c JOIN HumanResources.Employee e
: Z1 T7 u, b- x7 s; z) JON e.ContactID = c.ContactID WHERE EmployeeID IN
4 C) S% {, h v2 ?. T( D4 M9 d+ u3 Q(SELECT SalesPersonID 4 t7 V9 v6 a. f7 C/ n( w/ w
FROM Sales.SalesOrderHeader, Q# L5 m }0 h* Y7 b
WHERE SalesOrderID IN
; M3 a1 x$ y0 {$ n( z- P(SELECT SalesOrderID 5 a( t5 q- E" `; Q% [9 A$ }3 A
FROM Sales.SalesOrderDetail7 w% L' e' W% J
WHERE ProductID IN / T( r E( {3 o
(SELECT ProductID
% D7 F p* K9 m r& S5 G# p3 w, I- d& Y9 a" ~
FROM Production.Product p
2 y k8 d2 G( LWHERE ProductNumber LIKE'FW%'))); z5 u5 F1 d* ?5 t
GO( w V: \7 }8 v) {+ x" {+ z
/ d/ M( G) I3 d( p$ y
- x& E, P8 n7 N
( j; ^2 N, x2 x% H
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 1 Z# m! l* J. L2 ^( M/ _( z- X6 z
- C. W% j; u) r# c) `+ b& O) r
/ u2 h* v6 S3 C# p8 K& c" U
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
6 T) P: _9 j7 x/ B' p
& [ x/ _/ @" Z9 g/ O6 l2 w . f' [: l5 i2 `
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
# Y) d' L" L1 o+ H8 ]) V |
|