Board logo

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

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

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 $ Z# h; ^" t/ \* N0 d  S4 x

' ?: c0 P7 S" u/ A有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
, r. L# l' s1 }& o7 T
, q! n* O) @. S: @' o" F: k9 L试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ( Z% ^, H2 M3 k( p7 j

8 b9 b' J- y$ W9 r+ R: S; s0 C; I/ u  O: A
# [7 Q) j5 U  M% f1 F如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。   {' {2 Q; s+ n

2 H4 C! _, b* Z6 NUSE AdventureWorks ;
0 K. o6 I4 r7 K. xGO
' R* }& K5 J. _) O$ H& U+ P8 r* s( c# nSELECT DISTINCT c.LastName, c.FirstName ; }; T5 {' W0 o: i0 }7 [7 h2 ?! J* w
FROM Person.Contact c JOIN HumanResources.Employee e
3 \/ U6 U* \2 D1 N$ U- o4 S2 oON e.ContactID = c.ContactID WHERE EmployeeID IN
) b6 p+ d; m  z0 g(SELECT SalesPersonID * _, Z2 r8 R) E8 b5 y; t
FROM Sales.SalesOrderHeader; Y. B1 X% k: Z" x0 M
WHERE SalesOrderID IN 7 ~* d; @. X: ?; F; _
(SELECT SalesOrderID
/ Q) A7 D( \5 i$ NFROM Sales.SalesOrderDetail
' C  k7 z" w% G6 oWHERE ProductID IN
+ s% b! b$ ^* X9 ^% H' Q(SELECT ProductID ! V0 ~  ^, x. f4 D# Z$ Z+ z

# F) j' P7 j6 C  ^( ^" @FROM Production.Product p # @) e5 w; I/ z) L
WHERE ProductNumber LIKE'FW%')));2 \  B1 T1 v! W; v- |3 T
GO
( O! [4 R" G9 |/ j- l; j$ A7 U+ b0 r  e- @1 Y+ b

$ L# e2 B: ?8 ~8 G1 P0 Z
: Y7 a  u, d( k这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
% E9 i% ^0 L% ~  M% h  w" ^" l- }
) [2 o  W+ |9 L. q" N 3 q8 b$ w$ f, t! U$ A
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 " |) P( m; N; I! {6 p+ Q7 l
$ ~  D9 @6 S; M/ V" e% L. I9 {3 h

- B; l+ L* c% i# p! X# K% P在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。% S& J' Z! [) C3 t( G





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