返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 3 B2 \' u% A7 c' m7 w+ v" ?( i
  W+ _) P/ O, p* H% t8 r' s6 [+ R
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 5 O" X4 c6 x& S. R1 t3 N, |; V. @

  {& D, q6 j+ R+ j" Q1 {& ?试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 8 Z. D$ ~+ F6 p. G2 l, q
$ _; }, s! H, K9 i  Z
- m& n8 C% G; Z( `: r
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 $ B- }9 Y! p- S% U( L! k9 _( S

/ F$ Q9 V# ?; M& Y; eUSE AdventureWorks ;
6 H  ?6 @" ~: kGO
. I7 e: r# r1 O$ B3 i; A9 r0 sSELECT DISTINCT c.LastName, c.FirstName
2 t  U' [, j9 F0 _) P* n9 M0 e( \FROM Person.Contact c JOIN HumanResources.Employee e
" ?; F- R% a, ]3 X4 MON e.ContactID = c.ContactID WHERE EmployeeID IN
0 x+ L$ ]! h/ [: W$ }4 H! S(SELECT SalesPersonID
$ v+ l" [/ n. w  o  xFROM Sales.SalesOrderHeader3 g$ O- I' l+ i8 h. \7 b
WHERE SalesOrderID IN
# L9 O! ]& J( N% H2 F( U5 H  }(SELECT SalesOrderID
; Y! l. l& F5 [% GFROM Sales.SalesOrderDetail
' w! J& G9 U9 ?, pWHERE ProductID IN ; `# a( P9 S5 k, g+ d! y
(SELECT ProductID
* {6 l: T6 s% |4 t2 P' Y, k* Z! l& o9 G8 _0 P
FROM Production.Product p
+ Q1 Q" J; c: [WHERE ProductNumber LIKE'FW%')));
, l7 b1 s9 H5 `4 LGO- J# `( f9 W  {2 j4 _' z
/ b# A7 j4 {- `

+ o7 T; ]6 B- }, m5 C/ @! U
" L3 s  p5 ]0 |2 d3 u8 q这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 . h5 \$ A* B( z( _& w! e1 U0 S2 n
: N0 \( R( X; c% X

8 G2 \. X5 j3 R1 o1 l3 l我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
% d; e  d: d' c8 ]1 {: t
4 U9 r, R3 y. A 8 \- `6 J  b9 }* A! T! e( h
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。5 X  A9 g( n2 X3 y
89w.org捌玖网络

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