8 b9 b' J- y$ W9 r+ R: S; s0 C; I/ u O: A # [7 Q) j5 U M% f1 F如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 {' {2 Q; s+ n
2 H4 C! _, b* Z6 NUSE AdventureWorks ; 0 K. o6 I4 r7 K. xGO ' R* }& K5 J. _) O$ H& U+ P8 r* s( c# nSELECT DISTINCT c.LastName, c.FirstName ; }; T5 {' W0 o: i0 }7 [7 h2 ?! J* w
FROM Person.Contact c JOIN HumanResources.Employee e 3 \/ U6 U* \2 D1 N$ U- o4 S2 oON e.ContactID = c.ContactID WHERE EmployeeID IN ) b6 p+ d; m z0 g(SELECT SalesPersonID * _, Z2 r8 R) E8 b5 y; t
FROM Sales.SalesOrderHeader; Y. B1 X% k: Z" x0 M
WHERE SalesOrderID IN 7 ~* d; @. X: ?; F; _
(SELECT SalesOrderID / Q) A7 D( \5 i$ NFROM Sales.SalesOrderDetail ' C k7 z" w% G6 oWHERE ProductID IN + s% b! b$ ^* X9 ^% H' Q(SELECT ProductID ! V0 ~ ^, x. f4 D# Z$ Z+ z
# F) j' P7 j6 C ^( ^" @FROM Production.Product p # @) e5 w; I/ z) L
WHERE ProductNumber LIKE'FW%')));2 \ B1 T1 v! W; v- |3 T
GO ( O! [4 R" G9 |/ j- l; j$ A7 U+ b0 r e- @1 Y+ b
$ L# e2 B: ?8 ~8 G1 P0 Z : Y7 a u, d( k这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 % E9 i% ^0 L% ~ M% h w" ^" l- } ) [2 o W+ |9 L. q" N 3 q8 b$ w$ f, t! U$ A
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 " |) P( m; N; I! {6 p+ Q7 l
$ ~ D9 @6 S; M/ V" e% L. I9 {3 h