返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
- C. g$ z4 n" N 2 ^. @6 \0 N+ k
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ! d" c$ A9 ]3 }! r
/ H+ D/ p+ h1 t' S, m5 f
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
8 x, M( A$ [4 J+ e' h5 Z
+ r' l7 `% ~% B, b
% y5 v: ]7 P# U* H. [( D如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ; h! A2 v* z- k( n( I
# V! s+ t4 K0 n4 z) ~
USE AdventureWorks ;
& u7 t; h  p/ G4 Y0 Z& @8 |& FGO
2 ?4 q$ E3 q1 C# L% }1 Y% T# GSELECT DISTINCT c.LastName, c.FirstName
) c, y; {: U3 ]" A7 j3 aFROM Person.Contact c JOIN HumanResources.Employee e
+ p, i% U& w; r; Q/ NON e.ContactID = c.ContactID WHERE EmployeeID IN
2 s* O0 X+ V5 Y8 M(SELECT SalesPersonID % V- n5 V, i; r* ?4 w) j
FROM Sales.SalesOrderHeader
- o0 _# B' l5 b# VWHERE SalesOrderID IN
; m7 L: e1 y4 B: j8 P% ~(SELECT SalesOrderID
4 m7 k  h, t" x' WFROM Sales.SalesOrderDetail- _+ y3 `5 w  T% A
WHERE ProductID IN . t: J# M% J0 T6 J$ Y1 G: [) j0 p
(SELECT ProductID , A0 c, U* O5 ^7 k/ x/ I- B5 g# c

$ a6 i# Z4 ?! k5 J' g' j' qFROM Production.Product p 9 U! q  L  V2 R; @  U4 k
WHERE ProductNumber LIKE'FW%')));- r) n0 J' m! `
GO! B  T; I* _9 B, i5 h
+ Q- O0 V1 q4 H4 F) T8 _7 E

2 ~& B/ [! Z+ M8 c
9 o! U' `5 m3 A- C0 H  R7 q这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
4 l" C% c1 B* X
/ p" O; M& Y- b2 P9 W " f1 Y! j# R- k5 n% t- X6 W
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 5 S1 Z5 P$ K8 `5 w- v9 Z1 L9 j& G
9 R! f: S, D/ J0 a4 M0 D

9 E9 Z+ S9 h6 O在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。! G3 ]: w5 d- Z. ^  B  M
89w.org捌玖网络

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