返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 # b( x9 P( T; v$ z  V; H
8 d& K' l8 |! Q/ ^8 R% j" l/ S
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 ( g# Y5 @  n7 c9 n9 W
5 j8 |4 @; `  j2 `( A9 i
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
: b) y" Q  R0 X# m) Z
% m. w2 `8 P7 o: h* a3 a 8 Q/ z* M" S8 h5 l( v
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 # M0 Z! t( k, k* j' V# M% j0 P7 Z
: `; h5 L3 o# B$ h9 I' l8 w, \
USE AdventureWorks ;, g7 W! r9 W$ ~* a7 C3 Z( T
GO* m( T/ {$ W2 g# B- ]
SELECT DISTINCT c.LastName, c.FirstName
8 I$ x, V0 \+ D, W6 B% G% hFROM Person.Contact c JOIN HumanResources.Employee e7 {8 x6 ~& z9 I+ r
ON e.ContactID = c.ContactID WHERE EmployeeID IN 7 `' l* {* v( C# d5 _3 h( i3 t
(SELECT SalesPersonID
3 Z; @9 {2 B+ y8 HFROM Sales.SalesOrderHeader* p! ?. z+ b' P
WHERE SalesOrderID IN / B+ \2 f$ h2 \5 r8 m# g& `/ S
(SELECT SalesOrderID 2 j; s/ y7 o& a
FROM Sales.SalesOrderDetail
6 V. F0 m8 W" t1 @* a5 v( XWHERE ProductID IN $ U% Y, v( c4 ~* x3 Z! F
(SELECT ProductID
' N5 x  Z" j/ L" T/ V/ b. K" R7 N0 ]1 P) i2 ?: S' Z
FROM Production.Product p
: \5 Q% W: G! k/ _* {WHERE ProductNumber LIKE'FW%')));
" e$ c6 g0 c! H. q- H& eGO
9 q! D# H( v! d7 A0 w5 d6 q0 e
9 P3 x. h8 u* j( R0 v. d; q+ Q) \& |5 w

2 i3 c: o6 i7 ]* N; ]0 G这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
4 G2 B. r* ^9 y
: ]% K4 z, a& G9 ?, {
% U0 k& S8 Y. l& X' P  L& Z我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 6 u  W- U6 S2 a5 x* R; E

. c. S' ?. C% |& Q  B 1 ?6 L9 F$ Z4 [* J' B9 {$ B
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。1 W/ ?8 q; v! K+ a& m
89w.org捌玖网络

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