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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 % b" _: s, N$ Q$ _1 [# q* i7 D/ s

5 {9 G; E" T  X: \6 A. t有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 - ^0 L; \" O' P

8 r8 D# z# `6 |3 U' D/ s试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ! m; Z* `0 p  w% W4 J

# t$ E/ }: H1 {: J + Y. k; g! i. h( f
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
; y/ X- L8 e! `
" O% F! m3 o# J3 u; b: f! GUSE AdventureWorks ;/ A) O- y& ~! I7 }& o
GO
( O3 K  ~3 B. s; Z/ r! PSELECT DISTINCT c.LastName, c.FirstName
2 X0 d. ~3 _5 E/ {' SFROM Person.Contact c JOIN HumanResources.Employee e
! |+ p' |; f. i* dON e.ContactID = c.ContactID WHERE EmployeeID IN 7 u2 J1 l# A0 {  ^5 p7 ^* @
(SELECT SalesPersonID 9 _/ ?' \; t' ]5 z* r
FROM Sales.SalesOrderHeader
# I* I0 \0 w  `* j# yWHERE SalesOrderID IN
# I% V) U" ~+ s( T8 e  Q  U(SELECT SalesOrderID
; z- n0 C4 w" _FROM Sales.SalesOrderDetail
* V4 ~& W5 x& j  Y% J1 T& EWHERE ProductID IN
3 q! E1 ]1 k2 @5 W4 o) Y(SELECT ProductID
( `. T; j+ Z0 c5 S$ R
4 l8 a' q5 I" D' ?FROM Production.Product p # y5 j* Y7 w/ L! r( K
WHERE ProductNumber LIKE'FW%')));7 Q& M; b  R4 G" y" p
GO7 q5 g+ j- R* ?1 Y
4 @2 K. x; C. M4 n. {3 ~, R
% ^4 _7 B) h  X5 B

* _7 I- `; ^, d这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 6 T6 e" g: [$ V' S' p( |

! ^; e" i0 b. g. T( c8 a; M 7 |. h. l' j, G( p; v
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 5 l" _. u% c1 U0 p. w" m; {8 a
2 l! k% d  J$ x2 y  Q

4 X* ?3 M2 _7 e, D) c在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。1 t1 s/ P$ C4 g& }; T
89w.org捌玖网络

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