返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
$ Z7 p5 p7 j. n1 [+ E  Z! A   u$ ~% X: _1 R. b. c) x
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
6 `+ U3 t% ^- |: g " O3 t- }, \8 K- l
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。   K4 L/ F8 d1 e$ j% N8 g
/ h1 q5 x% I' K$ t

- |7 r; T$ p+ }: P2 M如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
6 _. v  a3 Y( l6 l; y# M; W
4 Q( o) H$ _9 I" e$ dUSE AdventureWorks ;
# B7 I+ M9 ?9 l! S+ ]* h6 mGO, p; S4 A5 Q' S- t% x; x6 d7 i' J
SELECT DISTINCT c.LastName, c.FirstName
# o' M9 d7 d6 z" I  g% @( K. v# ?" JFROM Person.Contact c JOIN HumanResources.Employee e* B' k  k" f3 Z+ ^% E: P
ON e.ContactID = c.ContactID WHERE EmployeeID IN : w% z2 Q9 x+ }, k
(SELECT SalesPersonID + w  k& [7 Z& P* L* ^" j
FROM Sales.SalesOrderHeader. c& R3 Q) d0 m" [) n" D! ?) l$ ]- n
WHERE SalesOrderID IN $ d3 j  B/ f. S% ]1 w/ n
(SELECT SalesOrderID & d( J$ T9 W5 S& @# g4 ~: {; ^1 f! v
FROM Sales.SalesOrderDetail
9 `# ~% Z( {( \/ c8 @WHERE ProductID IN   |, d! u4 C. f
(SELECT ProductID
- ^% y9 h# W7 N; x5 k4 O5 ]
5 E  g4 K7 @% _% O% mFROM Production.Product p
3 k0 B  I6 J/ ^0 F2 C0 wWHERE ProductNumber LIKE'FW%')));
  Z& g) ?' Z, kGO
+ E! g5 i; G/ _9 `; Z0 W, w5 Z. D; N

% ]# F9 X! g6 F" P5 X- F+ p' F . u/ t* p8 n# v1 H5 D* r7 ]! c! X2 p
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 9 W# q+ n* g+ b, X0 }& P! |/ Y

7 _1 Y; P. T( ]: k$ @4 e4 G0 B: C# H3 b
3 U1 r: z2 G/ |0 C$ ~) z, I* ^我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
& f6 d1 t: U8 s# u
4 i9 W6 s1 V0 T/ Z . F; }7 v3 v  o2 I& z* q- ~
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
7 l; X+ O1 l* r' }- e# [7 c
89w.org捌玖网络

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