返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 * [) B( d2 @9 c. Z" O: W
* _$ Y! n  w9 @& D8 Y% W
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 5 I" @4 W3 a9 e

+ v2 J4 M) l) O6 S' l试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
% t3 p0 R+ J* T7 X: @9 F/ ] 1 f' m- B5 F6 k" O* \

% W- R+ i8 h% A如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ) a8 |; E. u  J% u/ w7 L
  P3 w, O3 j: ?
USE AdventureWorks ;2 a; B* z7 D  S& Z! ^, |* L" F2 m
GO& @# Z; ]* K2 p# i* W$ X
SELECT DISTINCT c.LastName, c.FirstName 0 Z9 k. S9 c* g+ p3 j
FROM Person.Contact c JOIN HumanResources.Employee e
: F+ Y# |- ]. v; G, J- o! j2 xON e.ContactID = c.ContactID WHERE EmployeeID IN
5 ?, L- {2 f$ w; }  K; V% z$ g(SELECT SalesPersonID
( z* Y1 C5 r7 m2 J7 B) {FROM Sales.SalesOrderHeader# \( g8 _! [5 w& n* {- w1 o2 f
WHERE SalesOrderID IN , ?6 I8 P1 Y5 ^, Z0 o4 N
(SELECT SalesOrderID
9 c* h8 e+ h5 L3 |# v& }FROM Sales.SalesOrderDetail# T5 L! l& O( Y! U/ s: b
WHERE ProductID IN " ]. P4 L% c2 U6 h: a
(SELECT ProductID # ^1 U7 p) S7 P, T, ~

6 w( A. m" K3 L. g5 D, k) NFROM Production.Product p
/ z. H' _, n; ^/ ^! N( D4 [WHERE ProductNumber LIKE'FW%')));* i) w* h6 O) a5 j& H
GO1 z* y) i, e5 O5 y3 }8 a( U1 b

9 b  B7 c' @6 v; q% i( `4 y1 Y  W4 b, }# C3 e

$ d6 o) S1 y( k8 x, x: f( I这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
% y" b1 o7 g, j ( _( y3 U* U( {) X  h, E3 E
" W+ H0 _2 {2 t9 Q
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
# n! E4 }# ^- Y- m/ o( `2 j( J' y# S: }
! O2 g( a4 Z$ n7 s8 ^( [
. A/ P) F: S: S! C! U. F6 |在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。  c9 |& T8 f6 k' h- _
89w.org捌玖网络

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