返回列表 发帖

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 ! V5 d6 f/ c/ H; C# D; Z( N9 s# ~

; ?9 @. i0 ]9 O2 Q. m有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 6 W1 d6 @9 i+ m. r5 f

" ~7 I6 V( r- B3 M' e试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 4 j% t7 ~: U1 M
( v! `( k( a8 B& r& E6 o4 Z
1 q" Y- w% f: v
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。
5 Q% S( b. H; F8 [
! J5 \' V( i* u' tUSE AdventureWorks ;4 Q  V& b+ r6 T, f+ u
GO$ V  |4 h  ~% R2 L/ p
SELECT DISTINCT c.LastName, c.FirstName
" J$ ?7 W: ], lFROM Person.Contact c JOIN HumanResources.Employee e+ h  u1 w# F6 y1 N* q% }% C1 T6 N
ON e.ContactID = c.ContactID WHERE EmployeeID IN 1 S# k& m0 O. |6 D: W, Z: I
(SELECT SalesPersonID ! R" M. A# N$ z& f
FROM Sales.SalesOrderHeader
: I$ }( t. h7 c5 e$ M& ?WHERE SalesOrderID IN 9 ?; w. p2 J+ O+ \) L
(SELECT SalesOrderID ; P* Y# s# ~2 Z: a3 G; ~2 y
FROM Sales.SalesOrderDetail; g( i1 B' x) }% N8 z2 T
WHERE ProductID IN
1 f, b' y% U3 |' E' w6 A/ u(SELECT ProductID - s. \! Q6 V- @

) \1 y3 i8 R! e* U3 P" Z, NFROM Production.Product p
+ g: N3 Q: p! n* g) s2 JWHERE ProductNumber LIKE'FW%')));4 d1 a5 e& C4 n  G* B
GO" N# V8 K- R, g' Y9 ?& Y% K

% q0 m! A1 \2 p( z' q
" M* K4 `: h7 [7 l3 K; ~( ?
1 H( E/ I+ n, P这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。
# `9 ]/ v( A' ~6 e' w7 N , E6 R! M+ U, t4 i$ x/ k

# _' @, j1 W5 ?% C, o) l8 R我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 % z: E: y5 J. n5 y1 r0 n: a8 q( A0 Y
; K- }( d8 t5 v% _! e3 _

# R* c+ B5 c& [# U在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。  T6 T- d% n+ q7 n# s+ P4 b3 A  Y
89w.org捌玖网络

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