返回列表 发帖

SQL Server数据库的嵌套子查询

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

( l% H' V" R- F- j, W1 c8 f3 A有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
; k6 X/ }1 w5 H! Z8 K4 A
; s, p1 j5 l. s" @试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
3 b0 ^+ b5 Y0 `* n1 @: k2 z% S ' |& {6 @; }: ]+ @( X( F. w

+ W" b" b8 \7 N5 A! v, Y. F如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 1 D. Y8 |4 n1 p. D3 f* f: B6 o1 [
" |/ [, c  T! S  _
USE AdventureWorks ;
& s! }! Y, z+ Z% a* j. Z; fGO8 j, Y( |+ a8 }
SELECT DISTINCT c.LastName, c.FirstName
/ K1 F% Q8 H: u6 |FROM Person.Contact c JOIN HumanResources.Employee e
+ R% W$ \3 @/ u$ HON e.ContactID = c.ContactID WHERE EmployeeID IN
; Z& ^' N% c! K! j! Y(SELECT SalesPersonID 6 D3 c! e% y) _0 b" W+ G
FROM Sales.SalesOrderHeader" o; r- X; a( {, ^
WHERE SalesOrderID IN ' `7 h; F9 h0 o, i1 J/ b
(SELECT SalesOrderID 0 H9 C2 D1 j) D) b) G& f
FROM Sales.SalesOrderDetail+ N+ A% g. Z8 T0 G/ e8 P
WHERE ProductID IN 1 q2 z( H4 G) q, c
(SELECT ProductID % J2 w- s% O3 G% A
2 M  z- s$ N: W1 Z0 p6 d
FROM Production.Product p 2 ?- g- C) R/ s1 l3 K+ j' Z
WHERE ProductNumber LIKE'FW%')));" M( I$ d, [& A$ c: I) o
GO: C! S" Y: P9 x
- N& O& I* R! {' ?2 f. n2 U

$ @+ d0 G- {: f( A) P1 t' K! N  y
, I! Q% H9 g, i# g0 e这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ( U+ x3 G( z- l; q- m$ |3 q- f2 {6 G
5 H0 c1 a/ r) J, R4 k" T- {& i
4 i, e4 G* Q- r8 w+ y$ X6 }3 ]) Z
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
+ x: T7 \  o" @( g2 | # Q6 [6 c2 _2 {9 j. J- t
8 J3 C8 o7 J6 \! m
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。* s% g2 @- y  I2 ^- c
89w.org捌玖网络

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