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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
& u8 W) n/ X0 U) F9 W" o# c3 } ; @5 i; \, ]8 V; x( M. d
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 + H% F( P% }( n, X
. n! S- s; h7 j; ]
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 / y; _5 r' ]. c. ^  f6 _# }& ?
% h2 l/ J: x' r: V: F- R- M
( G& r0 Z+ e9 a. c
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 - L# q1 \" n. G& i- e

+ T: j& O% r+ v7 _6 ~1 OUSE AdventureWorks ;& Y. W# W# ^0 j! M$ @. p* K
GO9 Q) b# E0 a1 D
SELECT DISTINCT c.LastName, c.FirstName ! N$ v! n$ X$ B$ o. ~" S
FROM Person.Contact c JOIN HumanResources.Employee e( A8 X' W% V. M: N
ON e.ContactID = c.ContactID WHERE EmployeeID IN
5 m2 r5 q( N! ^7 c0 [1 n* I(SELECT SalesPersonID
$ D! J. r  ~# E; V+ CFROM Sales.SalesOrderHeader2 a: f3 I: f8 [  R( a3 I4 H6 o
WHERE SalesOrderID IN
- Q: h' r$ U5 R9 y: d/ }(SELECT SalesOrderID $ s) r' V7 L& k4 c, q# E& @2 l
FROM Sales.SalesOrderDetail
7 s3 \4 K% f+ x- S0 nWHERE ProductID IN 2 D9 F7 Y0 T2 A( N' M
(SELECT ProductID
2 }3 R) \, O* e8 T# D% I4 o
1 N' p, ~# e/ AFROM Production.Product p
, a5 X) w1 F8 UWHERE ProductNumber LIKE'FW%')));3 {7 W) _, ^' ~$ h% W; P- t, {
GO2 e4 g, ~8 X! D; o$ p5 B. g

- e- e( [# ^; a% m0 i
% h* V9 x; w7 B4 B
0 v+ G  |3 m+ w2 m- B! M这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
# V" G0 [- d" F# u* f) \& J) M: M
( L0 W( S- R( y: Y9 u( x
6 J3 B: y- c5 X) }( ~: z3 e) p4 w我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
+ F2 {4 V4 K0 e; G# \ : ^- h5 P3 p+ K: h6 h" [6 [0 I8 \" _/ m
+ p: G4 X$ D- v9 P
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
4 z3 `, l0 s8 u6 i2 f
89w.org捌玖网络

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