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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 ' @: r5 ~" w% D+ D: k

$ ~; b* b, B! [3 _' r' k有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 : d! ~' B% @$ Y9 D  ~5 q4 @
6 H8 n; Q1 p& Z) D1 d' i. e
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 3 ^- g! Z- w+ S2 h

/ K7 A1 }, C7 K  n8 K. e7 x
3 s/ E' E) e$ u如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 ) W) J1 R2 Q% x) M9 L4 z9 s$ ~0 V, a
# Q8 {3 r- f' L2 @. a2 ?9 Z
USE AdventureWorks ;% m- Q' n$ W5 X7 ^- y+ K6 \
GO/ s7 y7 N7 J3 |( x$ r
SELECT DISTINCT c.LastName, c.FirstName
+ t3 `: f( |2 s& y- i8 CFROM Person.Contact c JOIN HumanResources.Employee e
" o/ w! ?. O* t$ n" ]: r8 B+ WON e.ContactID = c.ContactID WHERE EmployeeID IN
& _" l. D; h5 F8 O! W(SELECT SalesPersonID
! ^5 C1 Z0 M5 c0 Z( RFROM Sales.SalesOrderHeader
, `4 `* {+ a5 s( w# ~WHERE SalesOrderID IN
8 N+ f' r( ~' y* f' m* B(SELECT SalesOrderID
, _/ H2 E0 B+ q1 k7 Y4 |# Q% AFROM Sales.SalesOrderDetail3 |2 `6 a5 M! ?  {  o2 a4 x8 d2 e
WHERE ProductID IN
. J) e8 I# ^/ _5 H( z3 E7 O(SELECT ProductID
4 J& P8 w& I. H- Y# r1 Y. }) b( P1 ^2 S. U( X9 m+ @
FROM Production.Product p
8 n$ s) @* d5 N5 mWHERE ProductNumber LIKE'FW%')));
8 ~0 n0 j: l) W" X7 z1 Y% B5 \! e8 S: _GO7 b0 ~1 ?: C5 a6 e+ D5 H
" A. E6 Y. e& v/ e4 _& T

6 N6 G  W9 _* D( Q7 c' G" X 6 R6 ^0 l) k" E& {$ M, A
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 5 ?8 p/ h3 J  B: V$ w  B6 s

8 Q: i! k, o/ g
3 T4 Q  z5 i% ?0 v- i我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
8 X; {! q  n9 b5 g' ]% \ / b! u8 Z5 O6 C" B, x" ]: V: ?" R

4 S7 S$ C( w& j) q: P# }7 h# b在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
* K$ @/ \7 ]3 Q2 |2 P9 K  r+ Y
89w.org捌玖网络

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