返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
1 }' ~- o' g7 J' T& C 4 D) ?& D! x% q+ n9 e
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
6 J  t9 ]# M2 A2 k
0 t  e! w) ?3 K1 G0 i' N试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 0 E( F& k1 J; \, D& F& A
9 @4 v. i$ U9 I5 c/ {( v

, z& g- t4 v  \! {5 \如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
. Q2 s% d  F1 v' ^, D
# f) m2 V: q$ m0 ~USE AdventureWorks ;
3 q2 W! i0 ~5 z! }0 `GO
: x  b) ]* Q0 C1 k  i! U) V* K: G) |SELECT DISTINCT c.LastName, c.FirstName * H4 C% d4 i  H9 i
FROM Person.Contact c JOIN HumanResources.Employee e
8 I+ n- {( R9 t# pON e.ContactID = c.ContactID WHERE EmployeeID IN
9 ]$ z: n, X# y5 i, X(SELECT SalesPersonID 8 j. j9 }+ n* ?7 g* l4 q& M, r) r
FROM Sales.SalesOrderHeader
7 f' f/ m+ [/ q# N; p+ C7 {3 ]: ZWHERE SalesOrderID IN & u$ y6 v& b8 c8 {
(SELECT SalesOrderID
3 E! |0 N( j0 F5 k6 H7 V4 x1 IFROM Sales.SalesOrderDetail
  {8 N; A/ {" mWHERE ProductID IN
# e  g9 s! ^9 i9 s, A(SELECT ProductID # G) `4 X' c! p0 s) v0 F7 M' S! f

6 f3 u9 O1 J: z# VFROM Production.Product p + B  c- ?" ?0 p2 ^* c
WHERE ProductNumber LIKE'FW%')));
( w6 M) @! j" D- c$ o1 m6 ?GO
  o" k# C1 l/ p# \8 T- p0 [3 w) ^8 w! _4 m3 ^# n1 Y
% K. w- @& }3 o5 z* g" T

2 X! c1 m; J6 ~. q( g  C3 ?$ x这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
: a3 ?9 v( p: @8 w0 U- H' v & X, H9 c1 e0 j- l8 Z
0 M: a  t) R( {( ?
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 9 O. r: ^9 d8 Q" F, \3 u, ~) {
8 I" @$ S) j! B! \" a9 Y

0 l& `  f% U7 V4 R1 F1 i+ Q6 ?在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
" z+ |5 N% ^2 `) k" p3 K
89w.org捌玖网络

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