Board logo

标题: SQL Server数据库的嵌套子查询 [打印本页]

作者: 野人e族    时间: 2008-1-27 21:44     标题: SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
0 o) K$ j) v' i* c
& }# e# b8 j* X2 Y, B有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
  w0 ]! _$ p( r2 n
8 J3 R1 E0 U3 E5 }. X6 m% H试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 - A, n2 U+ Q- o$ F4 Y
. P% {" i) h# m% D! M% a# J

9 T* f: v7 K* q7 n7 l如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
0 _4 }# _1 e- T' c; A7 _* p; A
$ f9 i% j4 }% A3 h: Z. `USE AdventureWorks ;1 Z2 ~' @4 J& ]9 V
GO, ]" c- V/ m* f! \
SELECT DISTINCT c.LastName, c.FirstName
. F  B2 L4 V( d; w2 I. C& b3 ]FROM Person.Contact c JOIN HumanResources.Employee e
4 W" R  O7 `2 d$ ?5 fON e.ContactID = c.ContactID WHERE EmployeeID IN
9 q- L9 w& Y/ }+ c: B6 |5 T6 E  H" G9 T(SELECT SalesPersonID
" Y7 Q# z$ T* mFROM Sales.SalesOrderHeader, F% t3 G6 a% A/ {# x" }* z
WHERE SalesOrderID IN 6 z* U; b7 M2 a- n; u: N! D5 `
(SELECT SalesOrderID 8 o) E, v& e# g" t1 \
FROM Sales.SalesOrderDetail* ^$ ]4 j  K" C: q
WHERE ProductID IN
& I/ p% s$ j) ]  K: Z+ l" ~& U(SELECT ProductID . \( e( L( {1 ~  F/ ~  H

. C" Z) v3 T; b) PFROM Production.Product p ( q2 M" {  T7 b$ F+ _* X
WHERE ProductNumber LIKE'FW%')));
# J6 _/ P8 U0 j4 f8 u2 xGO! c# n, G! n+ }1 w" W9 @4 \
$ V6 v  r/ u  b5 V* L
% P& E. _; i, S' S! R0 R2 E; E

) y. I2 L! K/ j! Z. h" M9 ]这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
' ?9 z* M6 E6 \$ ]2 m 8 ^2 D! d: T# n' b
+ v, y9 D; y: K' }' P$ R3 O
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 . `# y2 u; z- x+ B% K& \

9 Z2 D+ n- f4 X; a7 Q6 r! v
- E7 ?) Q$ B5 T  f1 k在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。) w- N9 ?( Q/ @& d- X: n0 P; K





欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2