9 T* f: v7 K* q7 n7 l如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID连接Person.Contact表格。 0 _4 }# _1 e- T' c; A7 _* p; A $ f9 i% j4 }% A3 h: Z. `USE AdventureWorks ;1 Z2 ~' @4 J& ]9 V
GO, ]" c- V/ m* f! \
SELECT DISTINCT c.LastName, c.FirstName . F B2 L4 V( d; w2 I. C& b3 ]FROM Person.Contact c JOIN HumanResources.Employee e 4 W" R O7 `2 d$ ?5 fON e.ContactID = c.ContactID WHERE EmployeeID IN 9 q- L9 w& Y/ }+ c: B6 |5 T6 E H" G9 T(SELECT SalesPersonID " Y7 Q# z$ T* mFROM Sales.SalesOrderHeader, F% t3 G6 a% A/ {# x" }* z
WHERE SalesOrderID IN 6 z* U; b7 M2 a- n; u: N! D5 `
(SELECT SalesOrderID 8 o) E, v& e# g" t1 \
FROM Sales.SalesOrderDetail* ^$ ]4 j K" C: q
WHERE ProductID IN & I/ p% s$ j) ] K: Z+ l" ~& U(SELECT ProductID . \( e( L( {1 ~ F/ ~ H
. C" Z) v3 T; b) PFROM Production.Product p ( q2 M" { T7 b$ F+ _* X
WHERE ProductNumber LIKE'FW%'))); # J6 _/ P8 U0 j4 f8 u2 xGO! c# n, G! n+ }1 w" W9 @4 \
$ V6 v r/ u b5 V* L
% P& E. _; i, S' S! R0 R2 E; E
) y. I2 L! K/ j! Z. h" M9 ]这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。 ' ?9 z* M6 E6 \$ ]2 m 8 ^2 D! d: T# n' b
+ v, y9 D; y: K' }' P$ R3 O
我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。 . `# y2 u; z- x+ B% K& \
9 Z2 D+ n- f4 X; a7 Q6 r! v - E7 ?) Q$ B5 T f1 k在你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,此时你会发现嵌套子程序确实有用。) w- N9 ?( Q/ @& d- X: n0 P; K