返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
# m2 {% z% y8 n5 r! f7 Z3 R
9 T2 G/ J8 s1 k8 U7 I, Z有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 5 a$ E0 B/ B  Y: {/ q  Q

- L% Q1 ?! h& s# ?试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。
# K% s. \# ]- H- H4 b
# C: `! x; r9 ]2 u% p" N( O
1 W* i% L/ @* Q# O0 {如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 3 ]6 K5 v# \# t, x$ ^" g8 [
; M0 N  D4 [( ~0 L6 P. O( r* Q
USE AdventureWorks ;
. t7 w3 z5 b! g, V1 W: m' kGO
" r" y7 i' a4 ?( q0 V! _2 mSELECT DISTINCT c.LastName, c.FirstName
3 k6 f& q6 V% u: |FROM Person.Contact c JOIN HumanResources.Employee e
. [& n/ H  n4 M* G& T7 eON e.ContactID = c.ContactID WHERE EmployeeID IN
" m0 N! }/ j: V: `; E& n% ?4 `(SELECT SalesPersonID
( |1 q# a4 L  J9 m" o1 R9 GFROM Sales.SalesOrderHeader' A1 k& ?6 C  y- V* {+ n
WHERE SalesOrderID IN 2 X; h6 w- O6 K+ w. }
(SELECT SalesOrderID 8 E% N# m9 k. Z0 _2 O) f
FROM Sales.SalesOrderDetail
2 ^4 D$ R+ f6 \: P- C0 mWHERE ProductID IN $ n( ~' c" K) r8 a, a$ q/ O
(SELECT ProductID : E7 l: p4 p0 D4 \3 A% N- x5 @

( m+ Z& D2 W/ \( q4 o- D2 D# pFROM Production.Product p . R) `0 f4 c7 `5 g
WHERE ProductNumber LIKE'FW%')));
# t8 U& _) E2 \0 [5 c0 b2 MGO& q) s0 e& \% I
( A$ Y- V$ d7 [. p
6 P) h4 m! L# u8 @4 B. E

( T, c1 S4 L2 J! T! n, e这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 % @5 t, }. W( l$ m
% h- r* H( m; J3 \% s

$ n- ?; z2 m, P: D我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 . u$ x1 b5 X2 h8 |: c( z2 S

0 H4 N, Q. E0 F1 x  j! H/ P+ A+ [
  J7 W$ U& w. g* t在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。9 y( S0 t6 a0 P" l* _! C' e  i
89w.org捌玖网络

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