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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 1 C1 F. Q7 Z; b% k8 ~
3 I( Z2 P, k- F) I' Y' M+ m
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
6 }7 `' d% r& _1 e9 O/ ^
, ^, V3 C! x, F0 g1 x8 X2 q试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 + ]: x* l( D5 `* I& }
& p  w0 n$ [' N4 l( F  I
) [( h6 a' ~7 k  \  X( P2 a
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
# M! [) N1 n/ @5 k1 s/ ^& K9 z- Z
/ q! j/ I9 z/ o; J- [# o  }USE AdventureWorks ;
* K6 c5 @& {2 x3 s1 P2 SGO
8 t3 w5 n  Q  R/ v3 O3 G* }! E" CSELECT DISTINCT c.LastName, c.FirstName - @6 z: y+ C, U( m
FROM Person.Contact c JOIN HumanResources.Employee e: k9 c, s% g; }* N) E
ON e.ContactID = c.ContactID WHERE EmployeeID IN - F* J3 l7 J$ I1 I% B- B3 e4 Y
(SELECT SalesPersonID
* E3 x  [2 Y! [/ |/ i2 vFROM Sales.SalesOrderHeader0 b& _, ]; a2 }8 b( G6 i+ O0 n, k
WHERE SalesOrderID IN
) n; [* U& s+ j(SELECT SalesOrderID 7 B+ Q) f0 O+ p( b
FROM Sales.SalesOrderDetail- A, [1 ~6 M+ V9 o: u8 z
WHERE ProductID IN 7 C" T( f! \4 }! E
(SELECT ProductID
9 _- d* n7 r* b4 R5 Y" @& c5 @2 C" B0 L; U/ G+ @  K+ r
FROM Production.Product p ) \7 O" E( F, S' ^, T: C1 {; l3 H/ u
WHERE ProductNumber LIKE'FW%')));
/ M( v4 S: `  CGO
3 L- L! I8 _$ ^, `. n2 o; f4 @" u, |# C2 N5 ]: k
. s6 N: P# x( m5 e2 p8 X

" c5 }3 j: A: u" }& g这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ) Q% B& y* s4 \' d' j6 p  F# f. \

0 U& N6 @( ~" v1 O
/ B+ K+ c4 @) z# Y! i+ j我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 # ]- G4 H* e5 t) V' v

) V0 A6 N$ f$ a7 D 3 {3 |" U4 `8 l* p) w# @
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
1 l/ K7 A" |% I( \3 @
89w.org捌玖网络

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