  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
8 D6 h* N8 k R5 W( f- v 2 _" ]& o" Q: E. p R. v$ T
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
! M! T$ q `% V/ ^) Y
5 y, r# s" q+ }: y4 j. b( x试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
+ E* r2 _1 O) s) s1 U
8 S8 U* F& C' `2 t# q) E. _ 8 ?' E$ `2 R' e+ y
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
8 _' R: i, }& k% O - m- |8 l9 S9 _: E4 ]
USE AdventureWorks ;
5 z' L) D v# VGO
% ]( e' k d9 R( M+ c# n8 LSELECT DISTINCT c.LastName, c.FirstName 1 F" n7 T# K+ O5 E1 v
FROM Person.Contact c JOIN HumanResources.Employee e
+ Y% A, U( @) eON e.ContactID = c.ContactID WHERE EmployeeID IN # h: k6 O* U+ i- j
(SELECT SalesPersonID
1 A2 Q' l8 m% B# FFROM Sales.SalesOrderHeader0 c" ~2 l A/ M9 r6 t
WHERE SalesOrderID IN 1 K7 R: Q7 _+ t1 q
(SELECT SalesOrderID
1 u* |1 k3 z/ i. T5 @FROM Sales.SalesOrderDetail
3 \: Z8 }" i9 i# QWHERE ProductID IN
/ i& L; Q0 U6 R) A1 R(SELECT ProductID
0 n8 a. N( a8 F; Y. M v9 Q
" |# P+ X# b% W4 ]FROM Production.Product p ; ?' g" b4 j) |' J
WHERE ProductNumber LIKE'FW%')));
; p" O* @* [( a5 S* _$ L. X1 p. NGO# A7 x) i3 |4 n8 z' j7 ]1 q
x0 q1 G9 g- U2 w3 D* t3 \( X- _; c7 h
5 J+ g* z1 ^+ Q3 J! _, y5 \
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 : H7 X1 o2 M6 w2 N8 L
; O& \9 `8 `7 ^& G, e+ J+ T. a
" }7 ~8 ^" t0 k Z9 L) X$ Q2 L& H* q7 h
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
9 R$ y7 G+ P5 Y+ U1 i: P ' O0 c# D* D4 [) B! |
2 |3 W! ^8 [# P: t- Q
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
$ H- ~+ h: H* `; n |
|