返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
2 U. ^9 I$ m' B% V6 q$ |3 X0 l8 \ 1 k5 g: h3 |% l7 w9 v4 g4 `, T" G
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
" a7 `, x+ M# y  x# g/ L, D. T
. G% P, z4 O+ t8 z试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ' e& G/ w4 y+ }' _% O

# ^4 |' P3 K2 \) ]. _ 9 u) q& k0 Z$ v! g; h* K7 h7 U2 f9 t
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
" d5 O2 q+ N" a# u  @9 H ! }8 r" x5 D# `
USE AdventureWorks ;0 Q' r( i2 |$ C9 K+ m/ G
GO
: Q1 _( S: Q+ @SELECT DISTINCT c.LastName, c.FirstName
; |2 I1 f9 D3 H( WFROM Person.Contact c JOIN HumanResources.Employee e+ W' k4 _6 i2 g$ y
ON e.ContactID = c.ContactID WHERE EmployeeID IN
5 T+ {7 g; n2 o! c(SELECT SalesPersonID 2 \, [; \4 @& W% }5 a4 w- x
FROM Sales.SalesOrderHeader
0 a3 }4 @: F. Q# l% \8 FWHERE SalesOrderID IN
: ]$ ~6 }! ^( q' x% j! Q% f8 R(SELECT SalesOrderID . S; a3 L* y! X
FROM Sales.SalesOrderDetail
: m! e! Z# v7 |8 _" `9 {WHERE ProductID IN
0 `' f6 Q* [* z# o& F# t9 E(SELECT ProductID
4 {; B' |* o3 k% N5 R9 P! _' m1 b( v6 W. g; C! ]7 R0 F% d2 e, t
FROM Production.Product p
7 k  f9 e0 k, ~2 L7 y$ N# UWHERE ProductNumber LIKE'FW%')));, |5 E& x/ n" I1 \* z& C
GO
2 w2 r& x  ~8 K' N+ X; b7 \' p1 _+ n4 M, f1 L
% ~7 i* [1 d% `
* [' r0 f9 p" d$ `% t
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ) x0 }1 u3 S$ z; S
. S) V" O- E. c

: H* j, K. T$ T% C: f" V( _" M我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
. N/ A3 z5 L+ o8 o- `" }9 a " V" h7 p" X- S- I" ]& P/ c
$ e% d5 ]; h& h
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
$ R2 Y* A" b: V, N- \
89w.org捌玖网络

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