返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 9 y3 f$ D) p5 V7 s; ~8 P/ |# C9 q

* [& ?2 P1 {  D2 f+ l9 x$ \有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ( ^" P" V/ O  i) G* a% L& N

+ G5 X4 [0 l9 [! ]4 [/ s+ ]1 e试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 $ w! s3 I9 L4 V' `* u
9 c1 W2 X4 f! Y5 W# y6 ]) y
$ e# h' ^3 |* a( L' {# }1 G: b/ Y
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 1 w- w# M& ~. H! Q" i- S+ u
9 `3 ]9 Q0 X) T% Z5 m
USE AdventureWorks ;
$ p" d  }8 r% G+ J! f" H% @: Y2 wGO
7 e- @  f) ^2 |7 ?$ Q" d3 t1 SSELECT DISTINCT c.LastName, c.FirstName
6 Y5 }4 R1 ~( r7 E5 b0 n8 jFROM Person.Contact c JOIN HumanResources.Employee e
: `( K8 t5 ?0 h/ t' R2 `ON e.ContactID = c.ContactID WHERE EmployeeID IN
- E- Z3 M. I9 w% k6 n4 C(SELECT SalesPersonID # s- a( h4 e. D
FROM Sales.SalesOrderHeader9 F2 R- @0 e' ^; q: }7 T
WHERE SalesOrderID IN 4 f; _, @( k; r: L7 T. b- z' @- a8 d
(SELECT SalesOrderID 8 ^$ [1 J1 A7 ^4 w6 u! U
FROM Sales.SalesOrderDetail
6 r4 ?2 h& N( o# V  V+ H! T& xWHERE ProductID IN
  M6 ?9 U$ J: `, Y(SELECT ProductID 1 ^2 \7 Y3 T: z" `2 X

" Q: N2 w7 [) b7 B! M! gFROM Production.Product p
% H4 t4 A' g" w. K: e. R0 {WHERE ProductNumber LIKE'FW%')));3 @3 h0 B. L0 _8 O5 H* n2 y
GO) ^, o( B4 f/ o, `* {
/ Q; r, O$ L8 J8 `- [) ?

; M: M% w& r0 K4 Y
% k* J3 s- q% @+ r. x, `这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 / B2 s- J& b6 G7 P# I+ i

* o1 a# Y5 J1 S) h% M! L
4 \) C3 X  J5 H1 y3 h1 R* K" V我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
9 U  G- v8 d5 B+ G5 D6 \
" ?& u' h2 o/ h/ C  R8 W " P- I$ b& l9 X9 |8 U* _) d
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。2 I4 D& _2 z& u9 _, T% }
89w.org捌玖网络

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