返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 & G; U7 D; C" f; F; O
9 g: R* T+ p  Z; k  @
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
: m) P  X1 V& g9 e 2 T+ ^, X' s# q8 ~' W: R
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
2 {5 N0 l$ S$ k: e5 b2 B/ i
3 ~& _& Q4 i5 p
6 K2 V4 ~" D) b+ w* e! m( T; |如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
, u8 A5 c- ?! s2 j! _5 d3 k" [0 m
6 t  O& L: a, F, [& h1 j+ oUSE AdventureWorks ;5 G+ ]' k. J6 Y) ~
GO( {: h8 {4 C! p/ |+ K
SELECT DISTINCT c.LastName, c.FirstName % }# n+ j1 k1 x# x6 g
FROM Person.Contact c JOIN HumanResources.Employee e, s$ v4 p7 Q3 _) x: c. t3 n- T" m
ON e.ContactID = c.ContactID WHERE EmployeeID IN
+ C5 m- ~  Q4 p8 I$ U  y(SELECT SalesPersonID
  q/ i/ l0 `$ K# V; |7 m% _0 [& L6 WFROM Sales.SalesOrderHeader% A" D  S. p, A5 H+ m
WHERE SalesOrderID IN
5 G% ^7 ~/ V' H! O0 w- D% T4 I6 B(SELECT SalesOrderID
" W* p( D6 u! ?FROM Sales.SalesOrderDetail
$ Z. j1 d; b7 G  VWHERE ProductID IN
2 C; u+ T; w- M(SELECT ProductID / q6 U# ~  x) B* Y! ?) J9 r

. \2 L4 ]% G: A) ~) OFROM Production.Product p
8 f( n5 q& b6 l# iWHERE ProductNumber LIKE'FW%')));
0 C/ b8 D! S3 e% EGO- g( b0 B- w, q- x  ~& }$ w
1 d) j0 B% A0 @" ~$ L( u; x
8 l* s" L* Y& Z9 k% J: C0 X
% l, O7 x9 Y; m, H% |
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 7 x4 _$ x% r2 R' P) Q. W

+ @1 U/ K3 s4 x" h% m% @
4 \0 W& ]6 p3 L8 ?( F, I2 C2 b我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ! L4 V) A2 o4 j# {& t+ k4 h
* G. Z. Y' G, r& G3 E6 ~; [

& t0 D% M2 O; m7 q# r在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
: n( U; Y6 g( J2 E8 i
89w.org捌玖网络

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