标题:
SQL Server数据库的嵌套子查询
[打印本页]
作者:
野人e族
时间:
2008-1-27 21:44
标题:
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
[) o6 h" `# h% r, t6 [& }
2 z1 Q4 q' l* b% ?: }
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
- |$ p9 n2 _( ^, Q$ W3 G9 L% R
5 |0 m, [4 z* s8 z
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
4 S3 H" C1 h7 `
: i N7 O7 I7 D) n G v2 M
6 n. P0 e3 y6 B% }1 ]: g
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
5 m2 i, C% d. X
7 z2 [! ?" ~, Y- M: v
USE AdventureWorks ;
& ]4 M; o1 F: \* ?, N$ U& K0 p
GO
" x: G: Q, q/ K' A! I; h8 r
SELECT DISTINCT c.LastName, c.FirstName
6 i Q% ?. }: J- `1 B- P1 Q
FROM Person.Contact c JOIN HumanResources.Employee e
0 ?- l7 f% E3 w7 C; @$ ~
ON e.ContactID = c.ContactID WHERE EmployeeID IN
: w2 D9 K; I( v" h4 T* Y
(SELECT SalesPersonID
/ M0 Y* a& h! J, A C
FROM Sales.SalesOrderHeader
1 Y( T5 K! a6 w
WHERE SalesOrderID IN
- S$ w( Q$ d% ^: R+ o r
(SELECT SalesOrderID
' [5 \1 \5 Q& d, F. J
FROM Sales.SalesOrderDetail
) y `. j1 g( w* f
WHERE ProductID IN
5 M; n! }+ i% j, g
(SELECT ProductID
; m a1 t0 x+ m) |/ @- ~
$ ^8 w1 M+ |6 G; R! C# L. g% ^
FROM Production.Product p
5 q0 Q! k$ G0 Q) F' e8 k
WHERE ProductNumber LIKE'FW%')));
2 Z" A) x; [2 F3 O" ~( N4 J
GO
5 `6 [+ }7 `) u( p; l' m3 G( b& x
* S. H3 V6 t8 M/ o3 O" O! u1 M9 t5 |
- B: V3 T8 r# w0 o1 i+ U l
# d! k0 f7 V2 W9 A6 ~
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
4 i& l0 k2 R A6 N& l7 O
/ Z2 B5 U4 ?) c" b7 C: k
; R' M- L/ F" e1 R7 y- ]7 Y" V
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
/ v! ?; j8 w+ Q' B
, i5 a& t+ V5 Z
* u/ R) x" j7 W2 a0 O& ^: Y7 v" Q! ]
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
( |: i( n! T4 s
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2