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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
9 x7 y. Z- D$ R0 P) x
: h" y1 b. @# w* s: I0 k, E有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
7 F# O( M( M$ s: L7 g6 h * w& I- W* U& D4 X" |& ~
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
9 R; k9 A! C( E" R# m % d% ^" H/ R6 X0 v$ q

, f; V/ b3 q' n4 T# k* e# F( P0 \如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
6 \- n& q$ _% q0 P , }7 G2 ]! _. ~) q( t
USE AdventureWorks ;
6 ~( m" e2 Z) H, QGO6 y: U9 I) |( z3 h
SELECT DISTINCT c.LastName, c.FirstName 6 }1 r3 A/ U- s+ G) |$ {
FROM Person.Contact c JOIN HumanResources.Employee e
7 @3 u# I% r, g0 tON e.ContactID = c.ContactID WHERE EmployeeID IN
) v" D; s, t% G% x1 M% x  l(SELECT SalesPersonID * I( X, h3 c; b+ C- m
FROM Sales.SalesOrderHeader
) w0 x/ G5 W: C( MWHERE SalesOrderID IN 3 ^, j6 k& _2 a. z% j3 Z4 Z
(SELECT SalesOrderID ( \( E) C$ b  j6 K
FROM Sales.SalesOrderDetail% S4 T0 o7 d% F5 Q
WHERE ProductID IN
% _7 e7 R! R, F0 J) ?(SELECT ProductID : _0 [) a$ J; s- T# c7 m

$ T6 ^( P% W0 v0 O  a4 OFROM Production.Product p 2 Y5 q4 |2 r9 V+ k7 B( z  I- u
WHERE ProductNumber LIKE'FW%')));4 M3 G  \, N: F  q* w" t
GO( s  W  R: e0 d/ n3 O6 `
7 R0 ^( ?, x& _& u; X0 x+ o* B

/ j% `* Y3 P# e9 ?
2 z& l) W, E* h4 l这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
2 j" y$ X6 |4 M# W. M : N# N1 ~7 z& x- q3 C5 `2 z% U
+ c0 J# N; s, s5 {* g
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
6 r$ B# s+ }8 W1 @
' ~9 w# G" X& r 2 H, r5 [- M+ G! {; `: M3 l% s- a  J
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
3 ]5 x0 }! @. r2 X6 x: y' [, K
89w.org捌玖网络

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