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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 . f+ M6 R4 Q# l" q/ B6 Q! Z& C6 z* j
/ j% N3 ^* v. q0 I0 `2 v
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
6 ?) b7 b2 w# R 4 D8 S8 |: i$ w- W9 h
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ( t: _( Y* [1 L3 n" V/ ^5 s) C
" ?% V" S( ]& N' I, u. k

6 q; _) O$ b* ?0 L# Z0 |! T如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
+ r" j, P& C6 C+ H/ ~ 0 C3 G/ I- a, g/ p7 i2 K2 F7 X
USE AdventureWorks ;1 E: O$ v$ a  B: N
GO& d% q# ?& K! S& L* S9 \! a: F2 H) P! c
SELECT DISTINCT c.LastName, c.FirstName
; `7 W+ E9 b; r6 j& MFROM Person.Contact c JOIN HumanResources.Employee e1 b1 X2 @+ R, [5 o& k- J
ON e.ContactID = c.ContactID WHERE EmployeeID IN 2 r5 u) Y) ]; V: ~, {
(SELECT SalesPersonID ; n, S* R- h' r% w
FROM Sales.SalesOrderHeader
9 G/ v1 w4 T" K: G! B  j$ @WHERE SalesOrderID IN
2 R, Q- L! w8 i1 e8 B4 L% e(SELECT SalesOrderID
+ T4 M( Z* Z# o: t7 UFROM Sales.SalesOrderDetail+ k( W% S% L  [, B6 z* ^
WHERE ProductID IN 8 @$ h/ B. Y/ {) i/ F( ]
(SELECT ProductID
' j7 O5 @4 K2 Q+ r6 e) o6 n6 {( _6 Z0 \& g$ {: Q& L
FROM Production.Product p
9 s2 }7 Z+ C6 _) l! `" f/ Y1 hWHERE ProductNumber LIKE'FW%')));7 j9 H* I3 y/ ~/ Y" F7 l, Q% V( l: B
GO
! Z  `6 X! {$ F+ U1 v: y& x6 s2 T% f7 d& K4 a. C! j; @
  D$ u3 X& L: H+ J# Y* ]8 D) ~+ O

: f8 p% F" W1 x; N6 B" X: o这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
% {# y3 r9 v) q' Z9 t  I) H8 V
6 a, [8 N1 Q0 K1 J 3 Z( o/ @7 `% q: o" W+ [9 _
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
1 e- F. y- L" w$ p  W& i9 G- w $ P% Z/ }6 D$ ?  Q: s* ]

* l' M6 s' D! h  }2 U% C/ l在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
- e" ]+ R! P1 R6 |1 R0 i" M/ \) X2 D
89w.org捌玖网络

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