返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
- j( z6 a) ^7 \ ' V9 u+ H* v, w, k' n. j* `) D
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 . h" o4 P' R9 G
" R1 z7 v1 s4 e7 [- j
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ; S4 g$ c; v$ G
) H0 e3 c" ~2 N
4 v/ n' I4 d+ r7 o; N5 |
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
/ S7 v! E: f0 T% |. K9 v
5 m/ n  a* k7 N0 W; ?  jUSE AdventureWorks ;
: d6 _$ M* n$ \: Q) VGO- s1 x. q' ~% H
SELECT DISTINCT c.LastName, c.FirstName ' |$ D. Z. v, A! S9 I; `* }
FROM Person.Contact c JOIN HumanResources.Employee e' h4 Y7 y2 X0 R0 u
ON e.ContactID = c.ContactID WHERE EmployeeID IN
8 v; @; C: y- e2 r; C: ?/ G(SELECT SalesPersonID - p& M1 j( V. J7 D6 v* T
FROM Sales.SalesOrderHeader/ t7 M; D0 \( r9 x- g8 Y7 T; l
WHERE SalesOrderID IN / e8 m$ u) [% |0 ?  W
(SELECT SalesOrderID
. F8 g& G& L( D6 B+ N8 xFROM Sales.SalesOrderDetail4 o7 j; ^) m; S; k) @1 h
WHERE ProductID IN
4 i& w& a3 C$ Q! {& J(SELECT ProductID
& ~5 H: I/ }4 o; Q. C: u6 H: v
- m! h3 f! G9 M  f6 U2 `0 nFROM Production.Product p ) t+ o. i+ r) X, J+ j! n" S$ l
WHERE ProductNumber LIKE'FW%')));
6 N% S% `) g! U! s5 K6 S4 N( ]( \GO. {. Z- m) r& u

4 x, G5 S2 s/ p9 k+ L
8 u+ R" z" x, n7 `
: d7 H/ _6 h& W  J这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
8 @& G: F3 x4 \5 ]( h# w) [) L * y& Y2 t; C/ Z' r/ n
- i% t/ o' V" W$ n) L
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 ) w! Z) }7 ^, U" ?+ I7 U

! B; I# H% f( O1 K2 } 0 u9 A* V' w1 Y
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
. G9 p% f% T$ T( N  B
89w.org捌玖网络

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