  
- UID
- 3
- 帖子
- 66
- 精华
- 1
- 积分
- 2387
- 金币
- 1067
- 威望
- 1015
- 贡献
- 1000
|
SQL Server数据库的嵌套子查询
许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
- I/ `! U$ x# t: \& r # d( x+ d. q# G( m( `' H% b& ?
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
2 n/ E2 S0 w: ?0 _! H
7 [* s/ }0 E2 P3 ?试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 ) j5 A( c/ F8 Q- H" ~
$ w9 Q2 J0 B6 b) p7 s- S3 D9 n" Q: O' j3 q
F! V' a O/ W% B& J$ b: _如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 & w; P4 O5 K7 s, C: T; S
" S, Y- s2 B% Y+ G7 b) J# OUSE AdventureWorks ;
9 @+ F( v$ ~! _GO
; ~; K2 r8 g/ [! e6 ?5 ` USELECT DISTINCT c.LastName, c.FirstName
1 B$ V9 x/ v% y; f5 h8 N% @7 b5 yFROM Person.Contact c JOIN HumanResources.Employee e3 s! R$ U" Y. |. M/ ^7 n
ON e.ContactID = c.ContactID WHERE EmployeeID IN
, H* B7 G! V4 i. v* q1 o$ o/ \(SELECT SalesPersonID
6 {5 r- W- {7 [; A. bFROM Sales.SalesOrderHeader
& Y" y9 ~; O. Z) y/ x1 RWHERE SalesOrderID IN 7 D! C! F O& _3 }" p8 o8 u
(SELECT SalesOrderID u" @9 |& X' i0 U
FROM Sales.SalesOrderDetail
/ T V" T% n& }& CWHERE ProductID IN ' g' b% [+ m1 P% O/ O( z5 |& h
(SELECT ProductID 1 W7 \ ~7 b! h& I
) v( }' X3 G4 yFROM Production.Product p
6 j' v& P& w& {& v6 Q" n8 n: V4 ~WHERE ProductNumber LIKE'FW%')));8 f3 s# M7 R# C% {: v! Q ]
GO
! d$ p, `( l) i/ R8 a
0 k% b; ~5 |) ?+ _3 u e
" j9 g6 x* A6 M6 @3 L- Q+ ?1 e k 2 P: m4 ]1 q6 p4 C3 G8 a5 J1 `7 M
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
$ X% Z @: t2 t2 K4 Q- _4 G) \0 z 2 s5 B8 l" ?5 f# a# E/ J
& Z4 \4 v" D9 ^5 p* s5 j
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
4 y1 y9 c- R7 c4 w8 v+ ~2 f
+ ~ v; b1 E; q# I& H9 S$ a
& }, o5 t+ } @, H9 Z! R# h在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
5 l+ C; W: f' K0 h- ?: L |
|