返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 : r1 y5 h5 V, d1 j! _

0 W4 _7 H7 N& b* P% ^* O7 B有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
! F4 S8 C; Q9 z& N3 \6 _
" K" `$ d; p4 w/ T: P3 z$ v试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
9 Z. C) r! ^" N" o* W% T
: @4 K. Z. P5 b  r& e1 J; x6 @
( Z4 Q' w: ]' I/ r如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 6 p: R  I4 I# \8 _& x' b7 P- D

; u. S5 B6 [8 X* b+ }USE AdventureWorks ;! @+ @  c0 A! w
GO
' L! f" g' u# j; I1 q3 B+ ]0 ZSELECT DISTINCT c.LastName, c.FirstName
& T1 g' i2 X8 P0 z4 W5 e4 oFROM Person.Contact c JOIN HumanResources.Employee e4 }. J0 p& i" {8 x' m1 E
ON e.ContactID = c.ContactID WHERE EmployeeID IN
* M' u% [5 C, }) ?(SELECT SalesPersonID ) F) P# O" z$ d. p9 k6 K  E
FROM Sales.SalesOrderHeader
5 D, L! ?9 i' [WHERE SalesOrderID IN 7 ?$ n0 i' j' S& ^
(SELECT SalesOrderID 5 i5 f; C+ j$ v; h9 [" T. p. _0 K
FROM Sales.SalesOrderDetail
! X8 h# s% d8 ?) O5 u6 ~0 SWHERE ProductID IN
. i/ J) B- B' e9 A$ K(SELECT ProductID
/ C0 L6 S5 x" d  v8 B& }0 r3 S4 c7 m' _  a2 r2 L" k4 r, S
FROM Production.Product p
: B- y+ v: ^9 z3 U+ N4 ]0 o& i) eWHERE ProductNumber LIKE'FW%')));, K, ?% }3 o& o& `+ w- I8 o# R
GO/ Z2 e, i( q5 g/ S

7 [9 L/ W* S/ D' Y# g% N
6 }5 R$ x+ [/ B( @4 G- G% o - m0 M1 V% Z3 C( z- n4 o5 {; N
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
, h' N8 S/ x! ?0 D
& ~* C& [' z( a9 K+ A
! P; e  N( L2 W% m7 A我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
$ l: W3 l  Z% n9 E   {+ \+ Q5 p- r5 e3 M
5 `5 X- O1 t& X( m
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
0 V! w, n' h8 s9 h7 I; w7 k
89w.org捌玖网络

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