发新话题
打印

SQL Server数据库的嵌套子查询

本主题由 admin 于 2008-1-27 22:43 移动 

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
: f- h  V0 _4 j7 v( `3 L, ~5 W7 K
3 O# u* m4 R1 k4 c8 ~: q- o+ [有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 , ?7 e  f9 {, C6 r

+ i* _( _$ u! P! h! a8 b试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
1 Y! W- j8 v' Z- I$ c7 B - T4 O" Q( C9 u5 n

+ {4 S1 S' O' X  J+ A+ _如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
4 _% D: M4 `, l; V. _$ `
# w; c; ]/ T/ z5 c. l7 A  k7 c; M. y/ q2 CUSE AdventureWorks ;
+ c) x; x3 o/ W  JGO
2 @8 X6 U" a( i  a" g! BSELECT DISTINCT c.LastName, c.FirstName : \# z+ k0 p, F8 v: H$ v
FROM Person.Contact c JOIN HumanResources.Employee e3 v7 x4 x. f6 H, O9 `
ON e.ContactID = c.ContactID WHERE EmployeeID IN
/ u8 R' \2 V2 f/ j) K  v0 r2 Y2 K" ~(SELECT SalesPersonID - \# k7 J- D9 F/ R* R2 D
FROM Sales.SalesOrderHeader# @1 e7 [' F$ l2 s" z7 ]& H
WHERE SalesOrderID IN 2 D, j# A6 z& C- M4 [% e1 _
(SELECT SalesOrderID ; N6 Z! [$ d0 p! w6 _* }" a) A- ~
FROM Sales.SalesOrderDetail
3 w3 |) u, r+ Z/ X9 rWHERE ProductID IN ' D& s$ ~4 G5 }/ x/ G! W
(SELECT ProductID 0 u# F6 B. R3 d7 G! H
* I1 _# b9 s% o, |: q1 `
FROM Production.Product p
( G# q4 T6 h! g8 bWHERE ProductNumber LIKE'FW%')));. I0 o0 |% p9 M. t7 }7 M
GO
$ M0 v5 n6 Z7 K* P1 k
& H$ l2 A2 w) S* A: k9 x7 A/ J
& y6 z2 C" q' i; `' D * a2 V2 D" @% u( h# W( g1 x0 P
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 0 G5 {3 t& X0 d# h! Y7 y* ~! Q# R
3 z% c5 d( j8 ^
; P: `0 o; I/ x3 n
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
% x% X- _# T0 y, s
$ @; Y8 I# }/ w- ?! v( N3 V; T  d ( ~/ y) a2 {: `$ y! \
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。. Z1 q# T' w+ `
89w.org捌玖网络

TOP

发新话题