返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
3 r2 M5 [! H( ?0 R+ F. I3 t ! U6 L8 V( |! L/ f0 X+ h
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
  c1 q+ e5 ]$ L; A  G
+ S& D& q$ g2 J试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。   K5 N$ Q" o% J+ {, R! N/ J

4 F! V0 h* a) @: P& q + e$ _* @) s! c/ H8 U1 r- _
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
' X# _0 \! e7 V) g, O: Q1 j / g7 g# B( M9 n" r* j
USE AdventureWorks ;% n* m% R( Q! j/ f
GO- A1 \8 ^! W& s5 g' U' ^6 E; q
SELECT DISTINCT c.LastName, c.FirstName
" I% z+ t$ H  d' v; dFROM Person.Contact c JOIN HumanResources.Employee e4 h0 F* z4 t' B. |
ON e.ContactID = c.ContactID WHERE EmployeeID IN . z# M$ W# ]) l. G' p( z
(SELECT SalesPersonID
  v9 E/ Z7 ^) D0 N! K- N4 M) k" J$ cFROM Sales.SalesOrderHeader
  x/ ^; l5 ~! |; q$ s; v3 `3 mWHERE SalesOrderID IN
4 I' \( i  E# X' E6 u(SELECT SalesOrderID / X/ N# m2 p9 k1 a0 a* K# ?
FROM Sales.SalesOrderDetail
( D. d, o' a% }" IWHERE ProductID IN
! T) @' f- O+ W8 J(SELECT ProductID 6 X0 a! D, Q3 J* {( Q9 @6 m# X
; \9 _$ B9 ^  ^( p! a4 B" j) @5 _
FROM Production.Product p
% O# h7 F( [, G  k9 r2 c4 ]6 QWHERE ProductNumber LIKE'FW%')));7 @; E+ O; A6 j  {6 G" Y" L
GO+ Z3 Z3 Y9 F; c. {

; V) `+ u$ e* P+ N5 Y: i
2 ]9 A. g6 y4 K9 V
# U9 n; k/ U8 x4 ~9 L) q- i这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。   H% U5 Z( T7 A6 m

3 H+ g) w# V# h7 J 5 X" N# O( e5 G; I7 k/ ~3 A$ ^+ Y. b. W
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
3 Y8 j' e7 `3 e9 e" Z, Q  J# h 7 |4 U2 Q" J/ |
0 U6 r3 n6 e# v8 k. _6 }5 \
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。
6 A! u- s# E; B
89w.org捌玖网络

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