返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 4 A# Y, G6 @7 s2 [0 p) Y

3 ^0 E, p, r" z+ M+ `" H% d有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 $ ]+ F% P2 {* X8 i7 E% P$ d

- U) W; ?7 ^! d; |9 b3 l试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
$ a% D* }+ m# i0 Z  e
9 l# T! q7 |3 D. {8 @& Q
5 h4 p& Q, h. A5 O7 }5 j+ T如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 3 j8 i/ B" i3 V! D" t* y

+ k7 B- J3 Z9 ?, _, g. JUSE AdventureWorks ;
' l% u$ s- c6 U% GGO
1 s+ O: B& N$ o* HSELECT DISTINCT c.LastName, c.FirstName
- ?+ t& v- q  R7 F) LFROM Person.Contact c JOIN HumanResources.Employee e4 ?( p7 o! t0 |  N9 [2 }- W
ON e.ContactID = c.ContactID WHERE EmployeeID IN
+ E7 U4 l1 p6 j$ c1 o9 @(SELECT SalesPersonID
& n! z; \+ |, _0 ?: R$ W/ y  bFROM Sales.SalesOrderHeader
/ t+ ^7 f* e4 }9 k* O* D% NWHERE SalesOrderID IN
* ]% r6 V* m4 A(SELECT SalesOrderID
) v1 f+ H% e% m& t" _+ DFROM Sales.SalesOrderDetail- u/ D. c0 E; X1 }- `2 @3 M  d4 _
WHERE ProductID IN
8 I; p+ I" o* t; [2 L! z: t(SELECT ProductID 8 A* k7 P9 J8 X3 n
6 Q6 d* K- h' d1 d0 s
FROM Production.Product p
) e6 D* `- z9 ^/ n+ e! @+ eWHERE ProductNumber LIKE'FW%')));
, G% E9 d8 P1 y  b  VGO  T  D7 {1 P5 i: \0 s- Y: M& Q9 _
( a0 i1 n$ P6 t4 J- O4 o+ |

2 ^- l" M0 v" n! v: g; w) S " J. s- \# S9 S1 s% C" i3 d& l
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
, s8 p) T: L) F% d + }% y" C* J% X# V

& L- L9 I& q) Z9 H1 ]0 {. g% l我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 2 c! X! c  R% t8 i

6 _$ T' p5 g4 i2 ?$ v% D# A
/ E) v, O! j; C! l1 j. k; J3 W在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
  @" a1 c1 z$ `! `$ W# q. k2 U
89w.org捌玖网络

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