返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 6 t0 m6 o3 w. h+ ]

! b1 k  h  f9 K* y8 k" J有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
# e- M5 J, p2 h2 }) A: I( m : U8 ^0 C; ?: R+ |) q/ p
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 9 `* C- [. z2 U# A' X: r5 r

) T) [, r5 T. a3 _( m# ?% S " j$ |$ u  q" I8 a
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
( P2 G% w6 I) f " `! I5 a( B( p" |1 y. O% \% X9 y
USE AdventureWorks ;
, z" B$ X# H" |. D1 bGO
& c5 I) g- t1 ~% @' Z7 kSELECT DISTINCT c.LastName, c.FirstName
; ]$ u% |1 x: [9 @9 N( T( sFROM Person.Contact c JOIN HumanResources.Employee e7 d& l8 v+ J' [7 o" x) M1 o7 g
ON e.ContactID = c.ContactID WHERE EmployeeID IN
/ `: t" g, T3 U% }: q  h(SELECT SalesPersonID   P) C6 {. I# `3 S
FROM Sales.SalesOrderHeader9 [& I- J& y3 u
WHERE SalesOrderID IN & ^2 @0 S5 H4 w8 p. w* E' i
(SELECT SalesOrderID
% U0 }$ N- q& \FROM Sales.SalesOrderDetail
, k2 U/ M# Z# T% _, xWHERE ProductID IN
; f) B! P; y! Y9 G1 z% {- i7 ](SELECT ProductID
, }* i: H5 j: U, r4 T! n, M5 Q
6 A/ L3 v$ O: {$ x# s6 ]FROM Production.Product p
8 b& }, c) V% A3 N- hWHERE ProductNumber LIKE'FW%')));
" m! V9 T  R  `% i! R1 [GO  y! {# |: r7 d' H
0 T: e- e9 i) t+ N/ u  {

  K! ?( B( ~0 l3 N+ E& C+ P
3 K( w% ?" B. P. j这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
6 r" b; u3 J6 Q; B+ K
: `/ v, D! @  G+ B0 H 7 P, a- r, c0 Q( p
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
- e5 r3 T- n& Z0 k( M, [% D( A ' k/ ]  W( X! }/ ^1 L) j

, u/ {. B# J9 g. t" v) A' Y3 p& P1 j. a在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。7 K" {$ i* ?  x( G
89w.org捌玖网络

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