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

SQL Server数据库的嵌套子查询

  许多人都对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。 . ], \1 p( m) i4 c% n9 e# R9 b

7 R: k4 H+ Y- O- \" L有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我们将重点讨论嵌套子查询(nested subqueries)。 " V6 w9 ?. n* [& I2 Y
+ C. c/ d( z+ v. l/ P
试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。 & N1 T4 P; K6 j( R8 j& v, e$ c6 C. p( Z
9 |! j. Z# l0 c. z& W6 H$ q, p
  L& q( E1 o' O
如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 1 Z* ^# n* ^. c0 Y* \* @
: t" G1 V0 X( a8 h) l/ G, S
USE AdventureWorks ;4 t( ^6 N3 w6 g5 m3 Q7 J  b4 a
GO
4 u; D' g% {. M0 U5 N5 W' `+ H2 OSELECT DISTINCT c.LastName, c.FirstName 0 l* ]/ \, b  L5 C" P
FROM Person.Contact c JOIN HumanResources.Employee e
" F  ^# y4 T2 o# ^ON e.ContactID = c.ContactID WHERE EmployeeID IN
. E1 w- k+ X+ b5 j# H; t(SELECT SalesPersonID
- i6 {% a5 v' i8 L' e) hFROM Sales.SalesOrderHeader" l) b# E! w# o+ [0 V7 u
WHERE SalesOrderID IN
% b4 q/ Y5 g" B: _(SELECT SalesOrderID
# r. W, V) U) JFROM Sales.SalesOrderDetail4 I9 I1 A, F' p, d
WHERE ProductID IN # r( E6 D, s6 ~# Z7 ~% Y4 q$ q
(SELECT ProductID
* l# o7 O) i7 q6 C; A& I8 k8 v% B4 E
FROM Production.Product p : w1 i1 k( n3 I; B7 v9 g$ W
WHERE ProductNumber LIKE'FW%')));: n7 G8 Y% F! W. ~
GO; n& m' F, j8 d

# W. l1 o/ ^( s! x9 z
5 b# g! F. O8 _" c6 b2 I
5 R0 r/ I& F2 Y& H5 U这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ( S, @! z' j! X$ {# E$ _7 p

# X7 J7 G8 v3 R4 T 0 ]1 e. q9 C2 Y/ w$ `' Q( Z* H6 c
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 . o8 V$ G- G$ i0 w. x

: Q9 o/ H( G; |. {+ S  @ ) T' }/ G4 x: o0 n0 d
在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。# v! ^5 ~1 T4 _7 A8 _  l- |
89w.org捌玖网络

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