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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
7 v3 Z  u8 l6 J; d) @2 n
+ f3 l4 x6 Y5 u, p0 l2 M有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 & i0 u0 e/ a6 h$ ?$ c5 z$ C
& r0 V! f/ b, y" a) t# Z. N
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 & v9 C5 j. `6 U0 E/ w5 s

: j/ z" U0 Y% d3 F
+ k9 d1 R, d# J; a4 K  V如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 " B  K. ~/ {* q) [# s
) d  C' v4 m+ F( G( ?2 ^
USE AdventureWorks ;
. f5 t* g) e# M0 U6 RGO
+ Y7 {# U- a% P$ f. ?+ }6 aSELECT DISTINCT c.LastName, c.FirstName " z* i9 @1 T9 q3 B
FROM Person.Contact c JOIN HumanResources.Employee e" c" ]9 d5 {( U/ ~. J+ D5 `
ON e.ContactID = c.ContactID WHERE EmployeeID IN
+ R( o: P5 c" y2 ^(SELECT SalesPersonID
# ^6 i' f+ Z. vFROM Sales.SalesOrderHeader: o6 n$ r$ K! g9 y- Y5 Q
WHERE SalesOrderID IN ) z6 T# z: {3 p) k' f3 f
(SELECT SalesOrderID
4 y: m" a' r9 ?! zFROM Sales.SalesOrderDetail' d: n9 [& M; z- C$ L$ V% t
WHERE ProductID IN   S( m" L. b+ M- t* w( H, z
(SELECT ProductID
, ]+ N  d8 p5 X2 |3 G4 c9 n# K7 u+ |$ h" y- C2 ^; l. o: }
FROM Production.Product p / D, l# B$ R, ^8 ~5 R) T
WHERE ProductNumber LIKE'FW%')));
: B; `" W# U% K* }GO2 I5 ?0 o( k2 @1 U: g) Q; W* w; P, z4 [2 H
2 T7 s/ K& N  Z( x% Z0 X- L' K* S2 O/ r
5 @- X6 A1 Z) g; g+ \
+ w" h, b0 L/ M! d9 Z
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 2 c% {6 h% ~$ `$ k

. {. t+ ?( S0 s 3 b3 ?" ~& ~- x% a% e9 S: ~% K
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 5 ?+ Q8 F$ {# n% v

9 w" g; z% Y. ~/ m 6 W+ C2 g5 ?! x: E- e( k1 r8 `
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
# Z4 L0 I0 o1 }/ x
89w.org捌玖网络

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