|
  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 * y, E8 R N0 y' v2 O9 Q( I+ ?
* ]. B9 {5 I' ?9 D& d有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 / t$ Y! [ n/ t# b h0 y: P5 V6 u
8 X4 f' t- {4 x. k
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 5 n4 z) ^% [7 [1 b, {# q) a
/ n% q2 ~4 @9 _/ h; `4 X . M; s' I- S! o' g" w4 \) s
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 3 B1 T! e I2 v2 r( g" j' R
* s7 @8 H' o+ |* ]6 o* v
USE AdventureWorks ;. q% y3 A* C( i- l8 a; R1 |' n" n
GO
6 N" C& o6 H% k8 o& WSELECT DISTINCT c.LastName, c.FirstName / \" K2 Q5 ^# d; F
FROM Person.Contact c JOIN HumanResources.Employee e
) W) l i1 r/ z) qON e.ContactID = c.ContactID WHERE EmployeeID IN ; B% S) L$ A# r
(SELECT SalesPersonID ) K8 `( A- o9 y5 r) @4 \: A! j
FROM Sales.SalesOrderHeader
( v' d. g8 b1 n- LWHERE SalesOrderID IN & s1 U, x1 y( T# l. v
(SELECT SalesOrderID " [+ V; L! r% o% g. f# T' T
FROM Sales.SalesOrderDetail* [( n6 I/ u2 Z- [+ Q
WHERE ProductID IN R8 j! a5 S" Q/ n9 y. ]8 E. w
(SELECT ProductID 5 v- b" ]. P* ^1 r2 U3 o2 ~ l
6 u ^$ `3 }; O5 e& Y) T6 }( iFROM Production.Product p ; v# E4 o5 g2 k
WHERE ProductNumber LIKE'FW%')));
4 K7 A) Z+ [2 b$ E$ ?" TGO
$ z; A4 T6 \* Z% F( y, g+ \0 V5 u
* U' D, e- ?# ?4 J/ ~% J M$ N9 W6 z5 `4 B( Z
8 c' z% c% @* N
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 4 P9 ]- }$ g6 j+ B0 v, w; J
1 @" `: t$ B ^
9 D" _; s; r3 Z" o
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
) ?9 c( R' N/ W% c* k% W0 } 1 P5 b: {! [. M4 o6 e
a, f: l a9 S8 E3 a$ c6 r
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
$ y( B3 G( {8 Q5 ^ |
|