返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。
" c$ i9 ]0 v9 ^* Q0 r; j' w 6 ]+ J" o4 T6 O- B( V/ ^' E; D
有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。
6 A% d: S8 _# X8 b) Y, M6 d) |
' U9 \  z  l8 y/ D) \4 ]# ]试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 4 _  x' {9 y" r. \

+ z* B8 u! g! U7 `% l
5 z1 T% A7 ?1 C$ z如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。   m2 r5 h. v3 y
2 K7 G$ m. u* S/ ^& U( E
USE AdventureWorks ;& F) Y& T2 j) \
GO
4 X: F1 c! K0 \2 fSELECT DISTINCT c.LastName, c.FirstName 8 k, m; e# b* z& I' h3 |. [
FROM Person.Contact c JOIN HumanResources.Employee e# ~3 M+ J  X# K, o. W) I; m1 o
ON e.ContactID = c.ContactID WHERE EmployeeID IN " n# Q! A6 z0 k# s3 ^7 W
(SELECT SalesPersonID
8 C6 `% ?9 L! E; k$ U* X: o4 P3 `FROM Sales.SalesOrderHeader# C9 J7 Z) W/ Z, \. k. ^7 z8 ~( p
WHERE SalesOrderID IN # }: \; T; D" B1 ^) ]# u% j! ?, O
(SELECT SalesOrderID
" h7 @4 L+ a/ aFROM Sales.SalesOrderDetail4 h% g/ Q5 G; ~+ G  b3 H5 ~+ c
WHERE ProductID IN 2 l2 z0 ]7 e, T1 _
(SELECT ProductID + m  O) S' y* B+ T7 V

- {( d; l% U" R! I  e3 Z3 O' k: EFROM Production.Product p & @& R* S0 w4 a2 T* |1 k' B4 n% m
WHERE ProductNumber LIKE'FW%')));9 j  u0 G+ Y- r8 K/ H+ e
GO
1 {" s: R8 j' R! s. V7 y: v% k4 w$ \6 @7 M+ S$ S. K

5 e% V0 {  p6 f! |
9 u6 Z5 g; j3 P0 `这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
- H, c0 w; Q# |' G
) @+ D  B  [! J% O) q  z* @ " v2 ~4 k8 g( `, A# W/ e! g$ E* J
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。
8 k4 k; i! [6 ~& C1 ]. F) L( I; R & [3 x* r, H. _; y/ g$ H
( m4 A' J! E( l- p# ~
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。/ q/ }5 p  j. i, C
89w.org捌玖网络

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