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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 / R1 O8 ^$ u, a" k# E
2 _1 X# l4 L0 i/ h1 L
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ( W4 W0 S% [% R, _" e' N

) q2 ]' _5 j% B" z* n+ Q1 R2 p6 O: W; P试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
# }) A) Y2 ~( r8 r# o% j
  G; M& o5 r1 B; }8 R2 m1 u; Z% g $ l/ o, _: c4 m- o/ L4 q
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
# l1 V. W& Z* Y2 y2 G  \; w 4 X. i4 g4 O# i, A8 C7 r+ {9 M
USE AdventureWorks ;/ F' @2 F' F- ?$ P
GO
4 J' I  m) L: eSELECT DISTINCT c.LastName, c.FirstName
4 U. r, O4 J; o3 N1 A' b+ oFROM Person.Contact c JOIN HumanResources.Employee e- x! ?% H8 h/ I1 g1 H
ON e.ContactID = c.ContactID WHERE EmployeeID IN 5 `: N0 d+ J; l: n, E5 Q% o
(SELECT SalesPersonID
( t: L0 k5 J0 K4 A# l& H$ I0 KFROM Sales.SalesOrderHeader
' ^$ a; I0 K; Y5 jWHERE SalesOrderID IN 3 {( }) a! ]' G- j% W" W
(SELECT SalesOrderID . C$ S& h" S* o5 u0 O! R( o
FROM Sales.SalesOrderDetail' T* j) Q7 }8 e! C5 W% K
WHERE ProductID IN : y+ D2 d' O0 @, F. I
(SELECT ProductID & L# O7 _2 J+ p) n, y# X8 }* E" m
% y) B! i* I* `+ t& U; g3 I
FROM Production.Product p ) F) i, d7 ?8 L2 d  \9 @
WHERE ProductNumber LIKE'FW%')));
% j  b( t5 j- K4 o, H6 u% yGO
% F7 J/ K7 m" d7 c8 }5 I) V! @9 N# ?1 @2 m. H; J# `
1 x3 q' _' ^" s1 s; H. I- @, \
8 a5 e& L' v, k/ q& J
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
0 ^- h5 d" t6 s, v5 G& q( u # w0 ?+ |# z7 w$ J
2 g6 `. n& s* L& b6 @7 C
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。   ?4 d6 L2 c7 [8 d: i% a: \( k
  U/ m- L% x8 A3 H5 ]
  @( q+ v* Q* w1 L" t3 k. M
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。& C7 T+ [5 J, |
89w.org捌玖网络

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