获得本站免费赞助空间请点这里
返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 2 j0 w. D9 o6 c# |
: {! j* C6 z3 B) _+ x
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 & ^4 C  @0 t* ^* f9 T4 t5 k

" ?' h; F: c* j* I$ f" y' I试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 , X3 p; ]4 `" l0 l

% t  w2 j5 {) Q9 l" w7 \9 Q: `
( D; n% g. f8 x' N如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
: L4 }! X$ G9 U; d7 k* ~  ? : k! ~$ O7 \# x* N) x4 J
USE AdventureWorks ;6 |0 X: R# X2 y* w6 ?+ ]) E+ e  m
GO1 t) l' \% c6 H
SELECT DISTINCT c.LastName, c.FirstName
1 V  M  O4 _6 o; z7 G% v$ Q" f- MFROM Person.Contact c JOIN HumanResources.Employee e0 ?" u0 o0 [$ k8 W1 G8 ~( a8 m6 v
ON e.ContactID = c.ContactID WHERE EmployeeID IN
6 ~; g! H2 o) J0 a6 R' c(SELECT SalesPersonID
. |5 x2 J$ p" J; wFROM Sales.SalesOrderHeader
9 ~. Z6 l. d7 x& r, vWHERE SalesOrderID IN
5 {8 u: u& s* o. j% p(SELECT SalesOrderID
: f6 Y8 k; }6 M& nFROM Sales.SalesOrderDetail$ S) w8 P! P  \% u
WHERE ProductID IN 1 R/ b" T4 X* B3 Z8 g- P
(SELECT ProductID
) e; o5 {9 u4 e5 p6 g$ W( u* S# p2 h1 T4 v
FROM Production.Product p
9 p  {, w2 Z4 V5 {( gWHERE ProductNumber LIKE'FW%')));8 Y/ f( u5 M- k
GO3 {7 p- M3 g% C! e2 x8 Z

( w" Y7 q  E! `! C/ u' u- E2 i# M) ~& ~  M; u5 \0 ]

/ i+ u4 ]4 a% P1 v: [这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
# [5 ?: m, e- g# C- \ , ^7 R5 V2 H1 q$ \+ n* o

; ~" Z, }3 ?2 Z" v# y  \* Q我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 0 g5 I0 a, p6 }( K0 W. D' \
; r  D. Y( c1 S

6 X& T' X9 _2 r: ^在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。$ w- m$ X0 I; `  B2 d% u- V
89w.org捌玖网络

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