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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
8 A+ p* f3 [' Z+ a6 P  z* W. J
+ m7 z! W$ I4 L有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 . U0 ~5 \9 I1 g. S+ f( z
: i/ }$ q% ?  O! M: s
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
, y& a; q) k- k. y$ E 3 T; z1 \' m! P3 u$ O4 N1 b5 Z

7 U- X+ I9 k* t. i( O' e0 k如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
# f& h& |+ ~2 E: |& k
$ w2 k, V5 I( c( _, [. qUSE AdventureWorks ;
# p- Q1 M  K: M$ _! eGO$ `3 z6 k6 j+ x( h% x
SELECT DISTINCT c.LastName, c.FirstName
% E& n: }! G: f  pFROM Person.Contact c JOIN HumanResources.Employee e# L$ Q0 E' A' f0 p( d
ON e.ContactID = c.ContactID WHERE EmployeeID IN 7 I: ^. t2 x$ N5 ^% }/ e
(SELECT SalesPersonID 1 [4 h$ R: R  d* o# I
FROM Sales.SalesOrderHeader
! J: t1 s! w5 A+ ?/ `% R; W7 EWHERE SalesOrderID IN
; t% Y5 C8 f  k7 M  \" P(SELECT SalesOrderID
8 T! K$ r+ N# k/ Q" @# `, [9 j1 QFROM Sales.SalesOrderDetail2 I6 U- [$ }, J* }, n4 S
WHERE ProductID IN 2 L% X  H% `' I, G& Q9 j2 [
(SELECT ProductID
$ L% R5 U' [4 ^4 P4 _! Z
3 e1 L+ R4 q5 }# R6 Q! QFROM Production.Product p
  C( {: e" I9 t. b: d' |# \1 aWHERE ProductNumber LIKE'FW%')));
6 v) f6 r% [; y! Y) P  B7 pGO
: K/ p0 F8 r5 j: V$ f8 L
" x2 ^& b% ?# K8 D* c5 D: s$ |' r" {9 @5 q  W  f( M

$ V' @4 i. D' D  o; f0 r这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 7 `0 s5 A, S4 r
% J0 y! g; r$ I
1 H1 D* W8 _5 X1 ~. r
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
6 k2 ^0 x0 g7 L. D, } 6 F: t5 O! g/ }! K, c8 f- b2 P
1 O1 B; O* s& U
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。  ?6 z+ Z+ D7 d* V( ?8 _2 c
89w.org捌玖网络

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