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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 - `! R) G" _8 ~/ B  ~: t3 Q, l- d8 v
- F( `0 W" S1 a3 f1 |/ p; T6 ~
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 # n4 {5 R! _2 s* x
6 z; C+ b1 W4 e
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
  c; {6 M, E  s- Q9 Z 2 B. P/ X5 \% S6 g7 x- r
) {& q  ^9 M" l  L3 f7 N- l( D
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ! p5 V: E9 O" |4 K  @4 P2 x; z
' y9 g  ^3 F) T9 s
USE AdventureWorks ;
  t% V. P9 C( Y; s) ]GO
# F% T! z5 Y: c$ M* [SELECT DISTINCT c.LastName, c.FirstName 9 B6 q4 S' n5 m! I
FROM Person.Contact c JOIN HumanResources.Employee e( @$ G) a( M; z0 a
ON e.ContactID = c.ContactID WHERE EmployeeID IN 3 Y7 ?$ X3 \6 p! R
(SELECT SalesPersonID
! R  ~! l6 h6 T# P% W% S% ?) d  zFROM Sales.SalesOrderHeader
2 [" x) j/ n; [  x! L7 PWHERE SalesOrderID IN
6 F' ~/ M2 ~( b, K(SELECT SalesOrderID
9 |0 ]; ]+ `5 X- B2 ZFROM Sales.SalesOrderDetail
0 F1 r1 }* m' V% fWHERE ProductID IN
5 }* Y7 a* Y7 c4 |# y(SELECT ProductID
$ c' C. h6 u" i, J) Y& u
2 t' f' O: M" N# C/ G  fFROM Production.Product p * F4 V6 ~" Z. j
WHERE ProductNumber LIKE'FW%')));
/ s+ M; y, z4 I- s( n' o5 Z6 L3 AGO
% f, `; _' v" _+ l: ]
' G3 J" l8 `" ~# o- {% n( @5 N/ m; w. S
, F+ ]/ T& l' ]/ Z# T& ^* t* Q! |
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
6 R7 ^! ^2 G# C6 I. W% s) U
4 s, X' O1 z6 f
/ |/ X+ P7 e& T3 `" D. [, F! u我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
+ D% }' J+ W/ J% E * W7 X5 x  `3 W

/ I- E7 X% S; t在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。( P$ l! {: ]! ?: ~
89w.org捌玖网络

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