  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 : t% W; e2 T+ }
8 h# {* @5 k' G1 e" j
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 2 |' T7 u- n$ u9 N! N" T2 E( Q
' [ i, ^% ~( X+ x% U) w试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
( a9 \) m/ t! S3 |9 w : O. e2 J: t; ^8 N
5 K" M) T# g( G
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
o( D% r3 L2 R' T3 Z4 R U* A& Y * c( P) v2 @! t/ [" F7 h
USE AdventureWorks ;
# u% I+ W& G. _/ W0 R9 s8 _GO, P! F! Q- a0 t* ], u$ o
SELECT DISTINCT c.LastName, c.FirstName 4 H* \# s, h& J- q$ ~" Q
FROM Person.Contact c JOIN HumanResources.Employee e3 A7 g6 ^7 W! X
ON e.ContactID = c.ContactID WHERE EmployeeID IN & S. |) N- W% i" L G+ E
(SELECT SalesPersonID 3 M0 O2 n2 k/ g. c& s
FROM Sales.SalesOrderHeader
, C& R$ M0 t5 ^$ a0 R% f8 |8 o7 z$ }* AWHERE SalesOrderID IN
1 B; I5 w: @& o$ S' J(SELECT SalesOrderID # f1 }" U9 c% x/ e5 p- ^/ ^
FROM Sales.SalesOrderDetail5 E1 r$ c" m x. H) o
WHERE ProductID IN ( i4 v2 ]1 o3 U( R, S
(SELECT ProductID * {4 w4 K* Q) r
4 v8 Q& C: c* x( Z" V# f( o
FROM Production.Product p
$ I5 w0 X- y; Q9 D3 K; {WHERE ProductNumber LIKE'FW%')));1 D: i" t& V* {3 @
GO2 u+ h. V2 n0 f t8 g |# a. Z
! ^! q4 v! {7 u0 o7 s* U7 T) |. H0 a: [ O8 P0 O6 x3 n; Z
& G3 i! r/ [7 f$ Q, L- E' {
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
3 _8 Y- `: J" Z9 E, l7 w0 m* N ' D+ k( `8 W% G( c- c
8 S, |7 G; u$ A3 B. E, b" n5 E: U我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
( p. ~, s" E/ v7 {$ g+ y- W
+ X+ n3 x/ X4 h: N2 ]5 N6 U
- z; X& i/ F& u1 O3 A, q, _在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。7 C5 \9 Q5 }8 M. n% P
|
|