返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
- d* x# P1 Z  y. v) x2 G
( J2 @  w1 L, {: u8 }, d7 u; U8 r6 H有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
4 Z* h* U! N3 K6 h8 O# a 8 m2 u; w9 d( q% L3 K0 h" l
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
8 P& L. p& S# Y5 m# R, |3 A& Q , v, E& b$ Q+ Y  H4 \! B! {: W' W
& G* `" T8 C2 ^! @' a0 V8 R, M- k
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 : n' x6 ?+ r, r9 a
$ r! ]* \; }' g/ X- P
USE AdventureWorks ;
4 i( i5 @8 D. Z  |, C; w% _5 O$ i# X8 ~GO: n; l, ?* S$ \& m* X+ J0 L
SELECT DISTINCT c.LastName, c.FirstName : B7 H0 P+ J; A/ ?5 m
FROM Person.Contact c JOIN HumanResources.Employee e( U2 g+ Y! T3 n0 J* I
ON e.ContactID = c.ContactID WHERE EmployeeID IN 1 q: ^/ t6 K, w; X9 M; w$ r$ y
(SELECT SalesPersonID 7 H3 e" _* s5 ]# k
FROM Sales.SalesOrderHeader
: G) `. I2 S# S0 m$ j0 O- PWHERE SalesOrderID IN
7 P+ `& l+ _0 @5 X7 V2 i(SELECT SalesOrderID
) v6 A# N8 a# {2 ?$ KFROM Sales.SalesOrderDetail. O+ d+ t* J" M* K
WHERE ProductID IN 2 o+ i# R) U  L; z0 S. J' W3 u2 }
(SELECT ProductID
' I% k. T2 u; b, }$ X( W
* f# o8 B0 p' V& o8 LFROM Production.Product p ( T, P% Z; `/ w4 D  u' @
WHERE ProductNumber LIKE'FW%')));
  B8 G/ z) H& ?GO
3 R( ~2 P4 }3 j8 J) h- V7 n, v' j: [4 G" Q! R

1 w- |; ]# i6 J( p- ` " v7 w. b9 E; P3 l: c
这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
. ?/ L1 ]* b6 R! e$ j
# r5 @9 n. R/ P/ I4 O
: Q8 |! C/ n' ]$ U8 e我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 2 K- \* ]" t# N" v4 V

; m, J( O4 R# u
% X8 }) s7 N7 I! r( z& v5 d在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
$ }: h8 Q( f# }' \' c
89w.org捌玖网络

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