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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 ' N# r2 u  I  m( i0 L7 ?4 _! y
6 @) n& R+ |! T. \" X; x. j' {# `+ G
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
* Q. P1 y4 Z5 T- R
3 R: j9 z. T3 O* s: ~% @4 v* _% M试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
2 u8 U5 @; c& j4 R3 z- p/ N
" f; a. c, `, \" k0 Z+ }' O ) L, ^/ n1 ?/ B, u* A8 L( z
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
% `* R" G* g. ^ # w' o" \$ c/ {" z3 U
USE AdventureWorks ;
; P9 y1 @" \6 ?- oGO9 q8 _% h7 a7 A+ l4 |
SELECT DISTINCT c.LastName, c.FirstName $ S. M' v5 X: `" j5 Z- f0 f
FROM Person.Contact c JOIN HumanResources.Employee e
9 ?; a! g3 {7 s3 JON e.ContactID = c.ContactID WHERE EmployeeID IN & m# Y3 O0 W7 c3 _' s  I8 k
(SELECT SalesPersonID ! x! P5 b3 G7 T6 Z6 V: y
FROM Sales.SalesOrderHeader
9 B1 z+ \9 c% I! R1 V2 wWHERE SalesOrderID IN
" Q4 }' v  k/ Q; \! U& ?(SELECT SalesOrderID
  \: S; E* u, m) w/ NFROM Sales.SalesOrderDetail
! D2 N1 }; s+ Y6 o. {) t9 |: NWHERE ProductID IN , e5 a6 h% _  f* R% G
(SELECT ProductID
# G, X' \) P3 |* Y5 h' i% t# r+ E" e
! O" Q: `* p4 W! q" GFROM Production.Product p ) i$ E: t1 }3 L# O+ K# }& m
WHERE ProductNumber LIKE'FW%')));+ {, q6 H0 H! J* V) m5 \
GO( L: t6 Q( i5 t- W5 _8 y
: Q# J7 a; P9 ^

' ^- P1 `! O$ ?  o
/ R+ y; J" `7 L5 }% J这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 / i, o' x, ~# \, w6 K. u

. D3 p5 Z' ], o( l, N* b
; I( l" f" R2 u+ X: N我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
' \8 e: u8 B& s- J* @/ c6 u
# c: Z$ w* A9 ]2 E+ G$ w4 g , h" O% ?1 K- K/ }: I
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。% l9 y5 |7 P. V4 x/ s3 S& S
89w.org捌玖网络

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