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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 + ?4 Q; S. E3 f: m

: E+ W$ L( e" Z8 r4 ^0 \有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 % R- e5 c0 c( S- y2 e
/ Y' F4 v: p. n2 V5 N
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
0 F9 X4 B0 T  p1 K& U  ^
, G2 G  T$ J8 J# m# q 5 U; b" l8 Y: S: T1 e9 T
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
. t" d7 e4 v+ i2 R & ]9 F: O6 ^9 v2 L( K- n
USE AdventureWorks ;
7 A. f- o5 A' U7 u$ x: CGO4 Y: i  y, y/ I! }  J$ {1 w/ z
SELECT DISTINCT c.LastName, c.FirstName
' j# m' i& N' }0 e: ^. A$ }  oFROM Person.Contact c JOIN HumanResources.Employee e
: ~2 \+ @4 c( f6 `ON e.ContactID = c.ContactID WHERE EmployeeID IN 8 [8 @7 y/ v7 n- w( \
(SELECT SalesPersonID 6 k' e1 ?" K, b9 X, A
FROM Sales.SalesOrderHeader
/ F2 Y4 W+ c1 A/ w& g! s+ o3 C: DWHERE SalesOrderID IN
* S: {% H8 k9 W- W3 @(SELECT SalesOrderID
8 D+ e  B: Q3 _5 B+ wFROM Sales.SalesOrderDetail. V! P7 J  }" z! n' B; [
WHERE ProductID IN ' J" I( |1 a! n/ y; L& r$ ~9 B
(SELECT ProductID
7 B& C: V1 K8 ]0 R9 ]! q, [0 w
) Z8 h# `& [0 t/ [. M; sFROM Production.Product p 1 S# j2 W( W8 O6 f, R
WHERE ProductNumber LIKE'FW%')));" L- K3 {6 x  k! V& r
GO9 f' l0 s% l. X2 y# v. H8 W9 M
$ b( ~5 |' d5 p8 ~( ]' w: g

4 x4 Y1 |: C: K5 Z( v: ?: ~ 3 _- t4 Z% E2 Z. f- I7 J$ v$ Q7 c
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ) ^! u$ N8 y7 O: |

8 b) N6 X6 q0 H" Y9 i( V
0 @3 u* L" u! |我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
9 b" b3 K9 X( g" U9 Y5 y" A
, X) v. Y" T1 U; Y; c4 a) A ) W9 `& A) o+ f, t
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
: {% d! `' P6 e& o% N0 j$ L
89w.org捌玖网络

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