获得本站免费赞助空间请点这里
返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
# Z2 t: E$ w( s7 v0 @) h
' T( d% f2 Q$ D有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 1 k3 P( l' F' ^! Y
* F0 m& m/ R' q
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
+ ]7 h1 e8 Y, V' G/ g& G5 b , @$ F  n# Z( w, K+ j" s' z! r/ |- N

3 P( o; j2 v" Q6 F" r$ K0 a, I如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
$ p9 S# K7 O( M( Z$ W& @" Q
, w, M3 n  \" L6 b/ u: WUSE AdventureWorks ;3 y5 G/ O; R0 P
GO
4 q1 y# J/ h& W) t# f. `SELECT DISTINCT c.LastName, c.FirstName
# b9 ^# v2 R$ Y% t6 `FROM Person.Contact c JOIN HumanResources.Employee e
- Y6 H/ w& `" I6 QON e.ContactID = c.ContactID WHERE EmployeeID IN
: _! C* V7 e/ l5 T/ `! P1 P0 T(SELECT SalesPersonID 2 H0 |5 ^- ]! D  l. }
FROM Sales.SalesOrderHeader; D) l! m7 h6 O% N% M
WHERE SalesOrderID IN & i) G9 s. K  r! [7 u
(SELECT SalesOrderID $ G3 Z) E( z- ]2 g3 V2 R
FROM Sales.SalesOrderDetail
. |- p* H5 S: Z% p2 \" T$ j% u# ?WHERE ProductID IN ( g. K5 u& W0 u+ x5 N  c; {
(SELECT ProductID
$ W, P/ }- V' k! S. i
1 {2 U# ^/ T' xFROM Production.Product p & N' w" l% p7 p4 |$ b# C3 p
WHERE ProductNumber LIKE'FW%')));
: @* L- Z  {& w  N* W% q% F- _GO
! D" I  P; F- U6 ~7 Q. N7 F- W) U6 W' d! E4 x% W! _8 z
% e; z8 J. r4 w# m
$ J# Z$ ]% t( e% \
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
+ Q  c8 j7 j5 O$ h- i3 E( h # V! i9 |* ~$ j1 ~& I' O
: ?1 a) l: n0 U& |4 i
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
# [/ i! `& }$ i1 O  H 2 ]8 L3 a9 p& a; Q; d; [8 J
$ F' ?1 m0 T. {
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。- R/ z* s: v- d2 E
89w.org捌玖网络

返回列表
【捌玖网络】已经运行: