返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
* u+ `0 }5 |  h8 Q1 O
: @8 t2 ~  ]+ Q+ ^. ?1 g! e有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
" Z( e. }4 Z. {$ A4 S* Z7 R & R. b$ k! |' K6 }  P
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。   w, S/ i$ s6 L  C

$ X$ O8 W% F0 |
6 \! O3 l# A. e# B7 m如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
# l3 T  ~& |8 |( D, f0 t2 o
. x- s4 t' C% n1 a' E* W9 g2 C1 ^. zUSE AdventureWorks ;
- G) H# p/ r, X  nGO
0 K* Q" [, N/ L! s. V' _8 xSELECT DISTINCT c.LastName, c.FirstName . ^; t8 ?/ K- C8 `; D4 e5 }
FROM Person.Contact c JOIN HumanResources.Employee e
/ Q0 x* O2 R9 D. `5 oON e.ContactID = c.ContactID WHERE EmployeeID IN
3 \$ j% y, a! K: W+ D( \! V(SELECT SalesPersonID
, ^% M, F3 U8 A, w( a" AFROM Sales.SalesOrderHeader
  o4 Y" o, Q/ ?/ LWHERE SalesOrderID IN % q! k7 x& z  h/ A1 w& Q
(SELECT SalesOrderID + ]( s1 L' {2 l# L1 O/ T, U
FROM Sales.SalesOrderDetail4 n* `7 I- J8 `4 J! \  C( P
WHERE ProductID IN 5 W1 w/ }- ]1 p4 e1 [; j) C! @/ U
(SELECT ProductID
$ P# W! V+ T+ P, |; @+ Z0 Z# @2 t
8 ~4 s* Y8 K1 [/ ~7 {FROM Production.Product p
: ?6 J& K& d! [9 t, WWHERE ProductNumber LIKE'FW%')));) w$ e6 x- C( I
GO
, ]5 t1 y7 d6 k! u4 ^0 Y2 ?+ G
8 S+ E5 m) H/ S' ^8 n) J3 }8 J0 ^9 ^2 d, I/ L6 g2 F
( r6 t3 ~1 R0 |& j
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 1 t: f! w  L% a* O3 V0 g: h
6 Y# C; p' }+ t
" {# E1 q, n& d
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 $ R6 ~5 D( N" P( X" Z4 l9 l7 ?
' O5 U" C! A- g$ S3 I; O8 E2 q: A

  {  |6 N& l% V2 V1 [6 Y& W! h在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
" B; t0 y8 X+ ?0 m9 r. F
89w.org捌玖网络

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