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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 * @9 p& h1 @/ X  l' \+ R; h

+ i% A7 [" ]: m% y有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
" j: n$ q* c+ A, q/ d! n1 [
8 d3 O% K9 @/ V0 e: L9 [试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
; q6 M7 a' V) w2 y* e+ @9 h  v+ |! s 6 [9 q: c/ G$ {! U, N

# q1 K0 _9 {7 h如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 - L: y; X8 r' S5 D. e2 ?7 G3 A+ y
5 u/ L9 o. e5 p. J
USE AdventureWorks ;/ t4 G2 \5 u5 p& F, [! K9 r; ~
GO5 ^5 ?. r! x" A! ?/ ^. p3 E
SELECT DISTINCT c.LastName, c.FirstName
  A- u! _8 p* h" M2 d% fFROM Person.Contact c JOIN HumanResources.Employee e
6 k, \* ?+ \7 UON e.ContactID = c.ContactID WHERE EmployeeID IN 7 N- h# b9 R# ]7 ^3 }; T0 _- w  z
(SELECT SalesPersonID
; w  I9 w5 g# P0 D* FFROM Sales.SalesOrderHeader* N& |" E7 |* G2 I4 S' N% M6 `
WHERE SalesOrderID IN
0 n/ X+ k' N+ s(SELECT SalesOrderID 5 t. G$ `, R; O# b
FROM Sales.SalesOrderDetail
. J5 `# a7 ~' r4 G/ F) i7 \' eWHERE ProductID IN
9 c9 v6 N7 v0 W8 L. I' g(SELECT ProductID & }. d8 x1 J' V& T

- }+ U6 h) @! t+ H2 }4 e. eFROM Production.Product p
% Q% l, I1 R" _9 GWHERE ProductNumber LIKE'FW%')));$ p3 ^" |" T' A% ]
GO8 \  t6 {* ?, @( p0 o

3 B- m- I8 p8 |1 O$ Q$ E$ q: q- H& ?7 }, }: S0 a( j/ i( x
/ E# \) M% X0 g' E
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
3 ]9 n7 s$ ^$ ]4 _0 I. x2 u. W
- r& @* S- _* s2 z" K7 ~ - |& z* Z  B* H6 p+ |8 L' g3 e
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 3 y! [: }" ]1 ^4 W+ i# a* L

$ g; y- Y; t# z8 l6 n ' F5 i  O6 t! q2 V4 U( n7 d
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
* r0 S6 n9 n4 `& {
89w.org捌玖网络

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