返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
6 c. \. o5 F# B/ G3 Z6 ~
6 c8 i( K% |4 L4 h有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ( e; ~* o! T4 H, G" b9 ]9 j6 j
. Y# P% h/ x8 N1 \/ S. b  F: f
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
6 @6 F0 o; ?+ k6 ^' |4 v 0 k; p/ D- U* d. v$ }4 O

: W# D( a- x5 K1 C) y: Q& _/ X: \如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 # x) I7 d8 ^- ^( }. R- i

' n$ g$ ?8 H4 x/ N9 VUSE AdventureWorks ;- o: G- R, z( K. ^* n1 m
GO4 x, W* j3 P  z9 F% V4 D
SELECT DISTINCT c.LastName, c.FirstName
% c# q9 d7 N, J- t8 _FROM Person.Contact c JOIN HumanResources.Employee e
5 Y# ~6 a4 A+ u& Y8 s! Y4 `' rON e.ContactID = c.ContactID WHERE EmployeeID IN
5 m/ W/ D  M' T(SELECT SalesPersonID : U8 H" n4 N# g, h: e5 A
FROM Sales.SalesOrderHeader
+ Q1 z& ^9 S% d1 {+ W/ v. bWHERE SalesOrderID IN ) Y/ s6 r( E* ~! o6 n
(SELECT SalesOrderID 9 y; N8 P3 n# O; A0 T3 D
FROM Sales.SalesOrderDetail
4 I* X# W5 Y4 i# D+ |) i% qWHERE ProductID IN # A1 x$ k; o8 y& M) x+ o
(SELECT ProductID % u4 X) Z" f! V
0 c0 {( y2 T7 N0 f3 F
FROM Production.Product p % s: F$ P. L. S
WHERE ProductNumber LIKE'FW%')));! b1 G5 |) {7 m$ `7 k0 g& c, a
GO+ i! f4 L$ ]/ U" k2 F; ]# Z
# ^( ^1 ~; o7 p" q0 e

3 Q& S; l  T' i 0 P3 t3 Y% t9 g( t. ]) b
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
3 t# D3 ]% y, P/ ~& E4 } % M; {9 C7 O4 X  o" ~  X

* A4 ^9 m' Y8 B% d* }我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
" l) K) T" K# P  j; \5 g. j
% c/ K2 M, x8 t; k0 s
/ q8 l6 C# j( Q$ M( M2 }" W在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
- \/ m; U5 Q" E4 |7 m  v# k" A" N) z1 k
89w.org捌玖网络

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