返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
7 a* Z6 `/ ~( B# \. ^6 l! h - V1 H9 B. q' @  i/ g, b
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
- _% J0 G  z3 y1 E ' M: X# e3 A2 i$ j8 E% B
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 - e0 V% z0 K* ~& ^

, J' w2 O! Q, `' @* `& Q, @
! s4 N  k  i' d如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 # @, n8 u8 X0 I. [* q
7 `0 |" z/ }9 d4 O6 |
USE AdventureWorks ;
! |" [. A- A2 J+ B5 }  {1 u( y  cGO/ f/ w1 b# r1 c$ E- E8 J- `
SELECT DISTINCT c.LastName, c.FirstName + F* a! t2 D3 P
FROM Person.Contact c JOIN HumanResources.Employee e3 \. w( y$ J/ }9 M5 H. B1 N/ J
ON e.ContactID = c.ContactID WHERE EmployeeID IN , Y8 Y/ S( k+ Z0 h+ D- }
(SELECT SalesPersonID
9 n. E- U- k0 {4 i' U" t& dFROM Sales.SalesOrderHeader
- H- l5 k' ~( [0 h# N3 ?5 \* E6 }WHERE SalesOrderID IN 5 o" B; E" ?/ ?6 g+ T' I7 \+ p
(SELECT SalesOrderID   e% p% e/ Z- w, E, S, ^
FROM Sales.SalesOrderDetail
# }6 j! w. [, h. `, \) v# eWHERE ProductID IN 5 Z* k" B% X0 o. s- j
(SELECT ProductID & m1 _3 ^5 W/ E4 E+ I
& t; H. d/ ~+ A; g% H0 \
FROM Production.Product p
7 A5 g2 h& R5 V8 X4 mWHERE ProductNumber LIKE'FW%')));
! {/ L' _! Z8 r  Y+ aGO% m) D3 w6 z/ x8 i; Y

" C: A3 f/ L" o+ o# s# f; a; r
4 N, V0 T% g/ {5 ~( z" L& E) X- ^) H 5 {7 S7 g* r1 ^- Y
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
* m! @3 {2 E4 Z% S5 D' W% X
6 c$ s5 f% |  S3 \4 Q
8 [7 r; B9 D4 `+ Q+ j我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 / U* f6 f+ J* o$ E' ~

( i$ N! }" [% o1 Q9 p
; ]" Z6 S# M+ ]4 f$ S在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。9 Z9 _( s# n& @. c4 _8 J3 a" [; u
89w.org捌玖网络

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