返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 : H0 E4 I  i4 B. I+ H- m

/ _0 @( u, |3 o, A4 M有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
/ m' k% t# t$ ^5 S1 H
' m5 I8 q% J5 v* `8 F8 q! \& j试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
+ W/ v3 X1 u9 P: r! ^+ o% _
5 R0 N1 H$ b8 A  S! y! B2 X 3 u% Y1 E5 M/ o! b9 @- d3 l- k) e
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
3 K& a- |) Q- {6 Q6 j * [/ q8 h7 G: |$ c% Y" f. O/ p9 K
USE AdventureWorks ;5 z4 z3 \7 A/ B0 j
GO
8 [/ {! E. U7 A0 G  K6 @SELECT DISTINCT c.LastName, c.FirstName 2 {. @$ A  W! A# C
FROM Person.Contact c JOIN HumanResources.Employee e# D( x' @0 L* {' C2 a* ]' A
ON e.ContactID = c.ContactID WHERE EmployeeID IN
" d2 ]0 z: ]; n1 a3 O4 k7 C% y(SELECT SalesPersonID
; f# M8 s" s& J: P, UFROM Sales.SalesOrderHeader
9 j- m7 F+ |8 \- q2 C( gWHERE SalesOrderID IN
3 d/ g1 K% x9 b  y3 H; L0 M& E(SELECT SalesOrderID
1 X: G8 n2 q: I' I8 |  R' G' ~( HFROM Sales.SalesOrderDetail" j8 c% J4 q' r' v
WHERE ProductID IN
5 P. j( E1 E9 N. R$ _& n(SELECT ProductID
) ]  {0 e; l" D2 v1 o/ Y2 a$ w
: K3 i" k6 O6 p3 [FROM Production.Product p
2 V& T- S5 |( @3 n  i8 P$ @WHERE ProductNumber LIKE'FW%')));$ A) `, ^8 y( O5 U0 l* t  w
GO
/ o# K$ y7 t$ v" E0 U  p: D) N8 h& c$ Y7 ]) I: @

8 T; S! [( j; B, L # D3 m6 |$ X0 ~' j; M: t' E; I
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 : p8 J$ L/ I9 ]) M& y' e* j) v
' h( t: @% G4 m& e9 v4 c6 ~+ {
) m: q3 q4 l& ?0 z: D
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
, M% A7 [7 @, a# ?  e+ y1 p
  ?$ s# F) g: h4 e: \
1 g* a" o& |6 V9 J在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。! p( b1 H( q* C* G% M5 T
89w.org捌玖网络

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