Board logo

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

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

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
/ o# _" s" D6 ]
3 F- ]  A1 L& y有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 $ _, _6 I* l2 D* I' g
, b+ N0 a2 x: M4 N$ {8 Z3 a
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
5 X1 @- I: U+ H
& M& \: V4 s9 ^' f* S( L 2 f$ v2 E1 \( [' M- [- B! E
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
2 z% g) C# r. Y% {8 _ / G/ T3 }. l5 l) t
USE AdventureWorks ;# ?' U) z- i9 T; u" @9 u. I9 [) y# u
GO% {( [: A, O% E$ _: O) C/ I
SELECT DISTINCT c.LastName, c.FirstName
. \1 B3 Q& R* Y) D* qFROM Person.Contact c JOIN HumanResources.Employee e
2 `4 w. R6 L; Y% v" u. g! t, I% bON e.ContactID = c.ContactID WHERE EmployeeID IN 5 Q% l* a$ C' e
(SELECT SalesPersonID - x' x$ h; O1 {4 M
FROM Sales.SalesOrderHeader1 b4 V2 d: A. k0 D; Z/ e, p
WHERE SalesOrderID IN
5 J" v9 w7 v) Z0 a8 L" l/ i& b# O(SELECT SalesOrderID
& c1 E) w, [2 g2 C1 ZFROM Sales.SalesOrderDetail' y& a9 A+ C1 F  s4 k9 w% J
WHERE ProductID IN , b: P' z' u4 `8 v4 V, x
(SELECT ProductID , M+ m' w! V' Q" h+ B5 X

4 U' N4 j2 q  A6 bFROM Production.Product p
  c$ K: `) K7 b8 O/ g6 {' }WHERE ProductNumber LIKE'FW%')));
: J/ D! I# |+ P* \: C- fGO- @" W8 [  w# @$ b% K. N0 B* B
& h* ~# K/ E/ M' _& Y& a3 y" [- `
: e$ y$ P; E$ F0 t

. o- r" T( c* p0 a这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
* ~) `& \- E! m9 ?) U% O5 N $ R! L6 J5 o# t9 h0 K6 ^- R
' k  Y+ `8 W/ f  C; l
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ' y7 {+ e- D* }+ Z9 Y- v
1 d1 \1 s, q7 J( J5 f& I
# j5 U% E% l7 R2 t* f) ?2 Z! `
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
* c( P) q: j( Q1 p# i+ @" R




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