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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 & X) Q, W  I1 s4 J+ J/ U& @
% T% F* M# u8 p! H: W, K# D
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
9 K, s, k) P; K  F. [2 f0 j& w
+ R- j: C: U0 l$ y) S试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ( r# I, w" Q+ m: X' f; ~; w

+ ?5 U* K! {% C0 K
1 ^, {6 @# R) U; _8 ?% o/ C6 M: q如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 1 P& g& i7 Q; X
3 i; G. L' L8 D2 R& |2 v/ P5 P
USE AdventureWorks ;
) u5 Q$ c: N; E0 V% A+ O6 V: V; aGO
+ H8 ?+ s; Q! pSELECT DISTINCT c.LastName, c.FirstName
1 b1 d# {! P- x; x. T$ D3 k5 SFROM Person.Contact c JOIN HumanResources.Employee e
" n( a8 j: y- u! A7 |8 KON e.ContactID = c.ContactID WHERE EmployeeID IN . K8 C/ N4 m  ~8 L
(SELECT SalesPersonID
% c/ e" {) N" e" y4 a7 l* m, xFROM Sales.SalesOrderHeader- x7 u; T& h2 z* Y7 l
WHERE SalesOrderID IN
0 a. {. I; R8 X9 B/ ^* C* B+ u, ]' Y0 N(SELECT SalesOrderID 3 P6 x5 }! m2 b3 T' e, k/ m2 J  H
FROM Sales.SalesOrderDetail8 ^8 V* ?7 z. Z
WHERE ProductID IN 2 [. I7 V3 D2 [6 X
(SELECT ProductID " e' G2 A; E1 {: h

% C3 {: D, B5 g; j+ GFROM Production.Product p
& \1 U( Q% b! s, y& o: eWHERE ProductNumber LIKE'FW%')));9 d* P* a+ [9 W2 r. \6 R( d; c2 w
GO2 r+ B, [2 k' o& N* G' v1 q( D
/ n$ ~( j' ^- a  q3 P* I

7 `* H6 A$ m9 F! T* n
; V0 i5 B. E: K" Y7 \这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
9 d. @0 h; U5 U' M7 x : n8 z/ w; x5 ~6 k! K; A+ Z: p
$ q; o% h8 V/ x
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 : P+ o: W/ }1 ?* d, g9 j

: q! M. X: u. G: U 6 L# y7 y" m7 k, _% `" P# I
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。! t1 H6 H% p7 B+ J  C4 \' u
89w.org捌玖网络

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