返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。   N( m, w8 k" x8 l% g  D& ~

$ D* w* A6 T& r有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 2 I' `0 r4 p7 S7 g+ ?( }# \# a
+ @' Y/ ~* p5 |! ?2 m2 }3 X) g& e( R
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 # t; ~. c' N* V, p$ C
7 a; e) [& ^; c: M% d$ U" J
' ~( I3 L9 N( E' K" q
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
9 r$ k8 t0 L% i2 T. `  e
7 D6 c; a0 ], e% y) DUSE AdventureWorks ;5 j$ u6 h! v" j  K% o1 x( L! e
GO; |- m6 c  ]0 J* U" `
SELECT DISTINCT c.LastName, c.FirstName ( j' U8 m* ~3 R2 f: i
FROM Person.Contact c JOIN HumanResources.Employee e; j4 w/ ]7 N/ i( K
ON e.ContactID = c.ContactID WHERE EmployeeID IN
- w2 n/ Q8 `$ l0 x2 o1 S$ s% v(SELECT SalesPersonID
1 c8 d" Q& ~0 c& d) S9 h' ZFROM Sales.SalesOrderHeader+ P9 r5 V7 R$ N* Y
WHERE SalesOrderID IN
$ D: M' {* m6 M: S2 B(SELECT SalesOrderID ) G! h! U2 n2 M: e' W2 ?! c3 X
FROM Sales.SalesOrderDetail
7 X* Y7 g  l* T. h8 \WHERE ProductID IN
- u8 M& ]  S( T/ m( I3 |(SELECT ProductID 2 T# f9 G+ D7 `% R0 f! K3 T
, M; A* A# O. V8 D
FROM Production.Product p # @/ U; g* a) M6 U! W; s7 v* g
WHERE ProductNumber LIKE'FW%')));+ ]& E) N$ R1 @# W9 ^
GO/ ?$ F) p3 H4 R" I) e

8 s/ Z$ [* o. q3 Z6 S
( G5 G8 j' l% b. l: K" K6 G% z6 k
4 V8 ?& a7 |+ q6 t: g6 a这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ' b8 ^; l9 L2 J2 m. R+ P

5 n- R9 G! {3 s& C9 A* O# n + P( k! b( _. l$ ]4 B; Y: o& _
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。   t$ J3 g# U: W' N: z
% I( w# y  `" w$ |. _% J$ o3 }

- P0 C. H! y$ u" G% f  S在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。6 i- G! E  g' j8 h, t
89w.org捌玖网络

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