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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 9 y* J/ }0 C; @2 l1 K# w

  S1 P0 D0 Q( r. T  m/ R有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
  L7 _' `3 q$ F" C. s# _
0 ^! {/ C" s4 t( L试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
& d" J: [2 x; \* k; i0 m" _
* N& n" Y' a7 v3 ]9 {) Z" L$ Q5 Z
% R/ l* s, u2 z如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
9 w+ C1 _& s9 _3 @6 o& H) d
0 `5 U+ h6 I/ Y7 }3 TUSE AdventureWorks ;
: I7 x  ?/ t; ]( Z. a- [4 fGO
# O* e6 _8 i1 bSELECT DISTINCT c.LastName, c.FirstName 5 v7 z- k' b6 y# K
FROM Person.Contact c JOIN HumanResources.Employee e
0 I) i9 n: I9 xON e.ContactID = c.ContactID WHERE EmployeeID IN ) l0 I  r; `. O! h* _: S
(SELECT SalesPersonID ( T$ k4 e& s+ m( ^# S. W, {. @1 A
FROM Sales.SalesOrderHeader) b: {: Q. l& G9 I' u
WHERE SalesOrderID IN
1 h: u  i4 B3 J* d, R( w) {(SELECT SalesOrderID
- j" A. b9 Z5 ]0 @+ \FROM Sales.SalesOrderDetail
; t0 s. T& y/ ~! V# p8 j! JWHERE ProductID IN # p8 a4 ^6 d2 l9 l& z! V$ n" \5 I7 h
(SELECT ProductID
5 K+ M/ p0 j- \( u1 K' V* }" x; b) [1 ^! U5 `
FROM Production.Product p
3 b. y/ \9 b. Y% t# U: LWHERE ProductNumber LIKE'FW%')));
5 K* r$ D, I! Z5 sGO
+ T" V0 x9 j' \6 \
- V5 I# x4 k1 l% N" d$ o! \8 }' c3 C  j: T

; \  v, H: R- J5 F; V" F4 G这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
5 T% @/ m8 x3 P: N
1 V0 {( `3 B3 t  J8 u) u ' G" F1 s' P  T
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
2 u& M' \" y( {, [
5 o) n# y/ \" ?
1 c! D. _8 y6 B. A* P0 L+ s$ A在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
! M: W' W* I  C7 F% N
89w.org捌玖网络

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