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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
# A! R- I7 n# ^6 a
/ z* V8 {: _) k% E# \有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
# F, N2 t: ^; L% F" o : Q1 A) b9 m  }/ j
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 $ l( |2 s% s1 I% S0 X

) m, z- G7 M7 n; |3 h. V2 F ' U3 R! |1 P; y0 g
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 $ {; _  A: w! s& ^1 |3 L+ {
! q5 i4 R  |3 f; \3 e) G" ]8 ]+ i
USE AdventureWorks ;
: ?( A  E. x8 uGO( e$ K6 p! M# k0 A
SELECT DISTINCT c.LastName, c.FirstName
/ ]5 B* q/ c6 y. c" X1 q8 Y/ ~FROM Person.Contact c JOIN HumanResources.Employee e. G' t5 X: ~8 ]6 m$ J1 X
ON e.ContactID = c.ContactID WHERE EmployeeID IN
+ L3 H9 ^' `& V4 `. E5 s# L(SELECT SalesPersonID & q4 Z9 w5 a( m: j. ]$ q
FROM Sales.SalesOrderHeader
% V. Y7 _9 k! ]WHERE SalesOrderID IN # ~3 i  w/ g6 Q' t  [; B
(SELECT SalesOrderID % o2 j! z; f: }! ~: k8 [! m
FROM Sales.SalesOrderDetail! ~) V8 t2 _; [0 b0 p
WHERE ProductID IN
: G+ w# z7 ~/ h1 W5 h, ~  l- h(SELECT ProductID
% [4 R* P0 B4 d
* t+ I4 l8 e! {9 `7 TFROM Production.Product p 8 p- O! {5 A$ r# c/ o
WHERE ProductNumber LIKE'FW%')));6 I3 L* k0 D. }  T7 y
GO9 U0 U2 I( s6 B# C. Q/ m  h
$ f6 f1 C# P5 G; M, P6 U; o5 d

) x6 [1 \1 x8 _% w; x ! n' D( r, b3 U- M
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 " [* ?0 l3 b& `
, ^" j& F0 A9 o$ \$ e$ ^/ C
8 V# P2 m- f7 w- T2 A
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
& @& X! z7 V% M5 i9 q2 V3 s! m8 u/ d
3 [% K4 v, A3 N5 W$ c% d2 }. V
: w- q! Q. |7 H5 ?9 b在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。8 j+ k1 _; l2 v, y, L! g
89w.org捌玖网络

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