返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
6 k6 B. {! f8 ]2 E; a3 f' {: i5 D
6 K& B; W$ C3 j2 D, C有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
" N6 }+ H! O) v% U; r& F2 m( w 8 i! s+ }1 w( A+ k, H- ~
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
. o: W$ y* {1 f: h9 N/ m
$ O9 r8 e9 s2 F5 q' d3 R$ G
: ?5 f; S+ Y* ?6 T3 i7 R如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 8 c7 `" i' J" U
% O9 }; u- |3 n) K0 Z
USE AdventureWorks ;' a* R% l5 G" |0 B! W  W, I8 @* Q
GO
9 {& ]2 a/ W3 dSELECT DISTINCT c.LastName, c.FirstName & k( r; W: R" v$ T  V6 g
FROM Person.Contact c JOIN HumanResources.Employee e# o! U; j- J. n; Q0 D! I, @
ON e.ContactID = c.ContactID WHERE EmployeeID IN
- K% {+ Y9 j& e- C(SELECT SalesPersonID ; ?9 C, G' }; S0 k
FROM Sales.SalesOrderHeader: F& a/ C. s% S
WHERE SalesOrderID IN
! U$ v4 z5 Q2 T0 S& O$ t(SELECT SalesOrderID % s( ?! T2 S) X3 b1 f8 `. V
FROM Sales.SalesOrderDetail
5 L6 C( a5 q& J; w6 @WHERE ProductID IN
0 M: m; |8 \+ h(SELECT ProductID 8 t2 U5 Q- c( E9 }7 e: T9 R
: f! `5 v2 q* k, ^
FROM Production.Product p
) ]4 W; A( @, c5 f( gWHERE ProductNumber LIKE'FW%')));* k) c% j) ]1 K" X. y
GO& }8 g3 l" B& b. ^1 s. J! A

/ z' P% J! n& o+ K/ D
5 k: d8 j! C3 K5 S( [3 k7 s
7 F9 d7 [. d  \- Y这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
' u7 Z8 }) M7 o3 E4 a % S0 D  x0 [, [, e4 l- a: O

+ T( `7 U- _. v, f2 d我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 : L9 i) O& @8 d. \2 a
1 M' M( b' p# N! u8 ]
! Y# r$ J' L) o  W) g
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。" G. H0 H. G2 _" m0 a% J
89w.org捌玖网络

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