|
  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
9 K& P# }' b0 m9 n! ~
% a% p. Y0 B: u- `! S2 C; [有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
0 g+ X" f; X! N& D
7 I4 ^) N$ o- F4 e" f; ^试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
/ H( p: c1 p6 j" P- ^' Y
. A1 ^. }) ^5 ^6 A3 b . c+ _, N, {& S! B0 y% a4 K, Q
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
" P; B& H( k+ O" } H) f* t 8 I h4 k, B' W1 z# m1 V
USE AdventureWorks ;
$ Y: q6 E5 d- a9 l: _ q1 sGO2 C& Y% Z+ t0 a
SELECT DISTINCT c.LastName, c.FirstName
. ~7 Y' J0 E4 I' n1 u1 v: o( IFROM Person.Contact c JOIN HumanResources.Employee e
& A H' o6 R7 U0 p gON e.ContactID = c.ContactID WHERE EmployeeID IN 9 \0 f9 d) ] A7 [
(SELECT SalesPersonID : C8 N; C9 ]7 V
FROM Sales.SalesOrderHeader
- s ?& d& s& @' c& O) i, w0 SWHERE SalesOrderID IN
2 U v( B* D0 I(SELECT SalesOrderID
. C" J7 I8 ]4 M* f' gFROM Sales.SalesOrderDetail! o2 B. l, ]7 W, A" m" v" q
WHERE ProductID IN
# H, ~+ m8 u7 [. O1 X(SELECT ProductID
E+ T; S( }) Y* n- ?. @$ Y7 w7 m* }8 C3 k$ d
FROM Production.Product p / x$ d5 X* i J. @. B' e9 v0 _% F+ c
WHERE ProductNumber LIKE'FW%')));
/ m( c4 j9 C5 P6 e8 V8 gGO
7 B) i; t- @1 I6 [2 V- O1 z' l$ c, Z7 k% Y$ J( {
9 ^ l2 A" e& P5 `" {( y
% l$ T* s! X: r5 C- n这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 * Y4 R: Y1 P% \' m( z
7 }1 K+ h; J& x) D
8 B" I' n' U& d! [3 ?我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
7 f( E5 `( @; i( k- | | / |" g8 `* } |" W5 L( V5 v
/ \" i! s9 p: @ i0 Y, t7 C0 V4 p在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
7 ~1 D! h/ @; p# z# q |
|