返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
8 l* C+ U' N0 c; o/ Z* @4 I: g
" o' H& A; M# E  d, x* P有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
  i5 ^$ ]/ D2 f8 C9 D
3 S9 z3 v! _' H3 u8 U- h+ r试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
7 U4 \/ N5 k* z- e9 b( p 1 P. V! w3 \9 Y3 f  o4 _8 o7 o
! t" Z. ]* U0 p3 r* @
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 % j2 {* I4 `) W8 s2 p. l7 |0 c
9 ?  {6 `: x+ [# Q+ E0 p
USE AdventureWorks ;1 ?0 L, S' I( a% v0 J" h* x2 F6 c
GO
. a, h0 G& ]3 h& V. z5 I, YSELECT DISTINCT c.LastName, c.FirstName
" Q( O& q  H, E3 ?, t4 }  k& p; UFROM Person.Contact c JOIN HumanResources.Employee e
3 i. {7 F" L  l0 X! ], c2 D% {/ t8 AON e.ContactID = c.ContactID WHERE EmployeeID IN 8 C8 M$ [! [1 c
(SELECT SalesPersonID   G; L( A' N+ L8 y
FROM Sales.SalesOrderHeader3 w' W0 z0 ~& Q# ^1 L# O
WHERE SalesOrderID IN
! m4 l+ ?4 S2 C/ N(SELECT SalesOrderID   W( w- a0 f( y! P
FROM Sales.SalesOrderDetail
/ K1 x- S' ]" M" L8 d; y& {6 PWHERE ProductID IN
& P! x3 v; q% h$ r(SELECT ProductID
/ U6 j; w" r. M8 l3 H# O/ m( j8 {/ M0 t
FROM Production.Product p
- t/ q: |# e/ ]6 f0 f. g6 AWHERE ProductNumber LIKE'FW%')));2 D4 R* U+ ^* r8 \& Q3 }
GO9 p. b  c3 m  `5 v* q- \

1 B3 v( j  q3 \7 b% ]' Q# O! o" R. m: s: L+ r! x. n; ^$ A& r% {
( @' ]7 H$ b  V7 `9 h7 x1 q
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
+ L, T1 F4 O( o  b# O3 _, w / l2 {4 q3 T, y2 ?8 m3 R
5 X/ H* x1 f, z# X: w
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
( w; \+ }1 ^% Z# ~# U
& o! Y7 p# m7 R! L; O 4 \) j1 c5 J1 s, I) n' z! O
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
" Q+ P8 H* F# _/ }: j4 W# \3 b' w
89w.org捌玖网络

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