获得本站免费赞助空间请点这里
返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
! B" q' C  ]3 t0 L, C8 w: _0 t
; I( T& B+ j$ r6 J& e2 ]1 |/ y有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
' k" Y2 x5 ^* L# b* e, S
0 V. c# v5 ^6 {5 Q5 X$ }: A试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ' ]( \( A4 R. w

+ X, y6 S8 a3 o, Q2 L) W+ |3 y9 H * k+ _. ^5 l. Z. U# [+ k3 a! ^
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ! x0 l) G# v3 i: Z- l* Q+ X

, i8 }7 u  h  @$ y' lUSE AdventureWorks ;2 o3 A/ U8 e; ~4 u
GO
; Q! Z, a: G0 Y* I  l/ q- y1 X2 |( DSELECT DISTINCT c.LastName, c.FirstName
8 i/ c* ^3 b5 ?0 l  D0 y% EFROM Person.Contact c JOIN HumanResources.Employee e  v6 |2 a% P$ r
ON e.ContactID = c.ContactID WHERE EmployeeID IN
! z( ^) s2 e+ x6 U4 k& y) ?(SELECT SalesPersonID
) z& i* C( ^6 ?FROM Sales.SalesOrderHeader
: h' d. _* }9 k9 B# mWHERE SalesOrderID IN
6 P  \- u5 }# Z: Q: \(SELECT SalesOrderID 3 [' m7 G+ N* D4 x7 e6 ~0 p
FROM Sales.SalesOrderDetail3 I& K2 e: h% k. k
WHERE ProductID IN
# C7 t& E5 ?6 }1 `; k- z(SELECT ProductID
- o  R: @0 R- _5 L6 O% q3 `* {5 \$ Q' Y% w8 F# \, g5 D& Z
FROM Production.Product p
" P+ S( ^% W' y) Q) \& ]WHERE ProductNumber LIKE'FW%')));0 V5 s7 \; u9 d8 x* M* N% M% X# _
GO9 P; Q  t3 }; ^0 U7 T7 u
% @9 x7 h3 j0 n9 B) i7 P0 _
, H' }/ I& e. B$ k. {' r& ], H5 x
7 P3 c" g+ F' a+ H# [0 W
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
- d) v6 J5 T1 R7 A0 [0 U$ A$ G9 l
( a+ H3 ?; @" w/ S2 h
) H" D% I8 N; e我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ( R4 ]5 W. g3 Z& U5 R; F
: w! C9 O% j0 j" s6 Z. ?7 F
% `5 ^! i; W% |9 s
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
* B  o2 c4 y/ I+ l8 E5 x( |
89w.org捌玖网络

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