  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
* ]; C! D( p9 T: O ( i2 L& E9 D+ o
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
7 I7 L2 i6 F# t" h
; `8 N% X2 f# ^' C6 N2 ^) P. r试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
- A# g3 k! Q( I R+ y4 ? % o e8 P" W4 P5 ~
: R8 [- j) P) `, V( @: \, ^如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
6 y; j2 f5 o' ?2 t$ d5 k% P' E8 t
% f5 u6 M. W* F, @/ N3 i& \, Z/ \USE AdventureWorks ;1 I. m1 l$ s$ r" ]. x" t4 q! d& E
GO
9 `3 c, ^; |9 G0 mSELECT DISTINCT c.LastName, c.FirstName
* H1 b+ K# ]3 k. h2 {, {& H2 RFROM Person.Contact c JOIN HumanResources.Employee e
; M+ S; B7 u0 K7 KON e.ContactID = c.ContactID WHERE EmployeeID IN
, W. G7 p! Y/ k3 g(SELECT SalesPersonID . t3 B% u7 o' G+ o% N
FROM Sales.SalesOrderHeader
. g# |: K! o9 ], `+ PWHERE SalesOrderID IN % p& }& D+ Z, ]3 {
(SELECT SalesOrderID
+ G s. o2 e) l! @# @% LFROM Sales.SalesOrderDetail
5 m; o Q3 D: L @4 Q# d. T$ @+ QWHERE ProductID IN
4 k% x( @! B w(SELECT ProductID
6 d3 i+ o7 {( N! ~
8 ? s" h% q: z9 mFROM Production.Product p ' ^- {% i# p4 L' O* c( A2 Z
WHERE ProductNumber LIKE'FW%')));
* y* A$ |2 G, F! RGO
+ p6 B$ X) ?/ g5 C! h$ ]! d/ i1 S, a. Q/ m/ m% l/ W- x
8 x- h3 j8 ?# m7 ?1 o
* M l* a. U+ n5 s, Z! E这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
2 h1 l, q% R% N( ~# A+ n* A . Z/ ?# @5 |0 v0 s
9 g% U/ A h. E5 r! f; B$ E- V9 K5 ?2 y
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
& ?2 E/ H- V; R3 K
0 D+ A4 D0 [" @6 p: O( w J' A6 k $ y; p* K/ k* J3 j
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
- ~2 i; M8 L+ l) }! e1 L |
|