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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 ! q4 x8 N+ ^7 q" I8 X/ j2 ?: F- s
9 _6 `9 J0 R! C" X& M) Z
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 , n2 Q6 }1 a* S2 C* G) b1 ^" S, e% ?( m% M

' Y( ~4 ~: e3 Q4 ^1 ~" H$ F试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
1 B. v% |! [3 Q$ y
1 G  H, \& V, A3 w/ ? * [( |4 j% j  w) S1 I
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 - s8 b- c' ]/ @) z  o. m& k
# j" o. ^: B& [9 p
USE AdventureWorks ;
$ X5 O. C2 Y1 J4 _! P1 e* bGO+ q6 e+ P. D8 |" a5 E
SELECT DISTINCT c.LastName, c.FirstName
6 z0 c& |/ m" ^/ Z$ nFROM Person.Contact c JOIN HumanResources.Employee e
3 o6 v% k0 e! ~( ?+ u; S/ zON e.ContactID = c.ContactID WHERE EmployeeID IN 5 |1 H: Z' g% ~: c4 D
(SELECT SalesPersonID ) K: c9 h' ^/ P: W' z
FROM Sales.SalesOrderHeader# i) j$ t/ x$ m7 z6 _( B$ |+ d0 o  F
WHERE SalesOrderID IN + d3 m1 F2 B" U
(SELECT SalesOrderID
! H" p1 N* n' p6 o1 X- Q/ [FROM Sales.SalesOrderDetail
/ M3 _/ e" u; P- G& {7 OWHERE ProductID IN 4 J* T9 Q$ I% Q) Z# U& E
(SELECT ProductID
. B, E* K! P3 C8 E7 {2 D5 S/ `; z- i0 S
FROM Production.Product p
: {& o' I* ~+ jWHERE ProductNumber LIKE'FW%')));
$ G& y' e1 ^& L+ G/ bGO
# _8 a& B, u: z* G+ x# S2 Y9 M3 f* r+ V  z( L, D1 H$ ]: f
# d" B$ l/ y0 [7 e4 ]
( K0 K0 m7 l  e, n
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
; v" U  K- r2 r
* ?6 x9 {9 L: G) @$ e   n' E# j# S0 t8 w2 F: M  r# k
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
; \$ x3 Y5 [0 O! w/ x$ F7 Y 2 u+ g) t+ e. U

1 d1 S. d2 x/ x1 S+ c# n& r! l. {在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。" _' y( i% P6 f6 J7 J( {, H
89w.org捌玖网络

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