本文聚焦 嵌套子查詢(子查詢中再包含子查詢),展示如何由內而外逐層解決跨多表的業務問題。
資料分散於四張表:
Person.Contact(聯繫人)、HumanResources.Employee(員工)、Sales.SalesOrderHeader(訂單主檔)、Sales.SalesOrderDetail(訂單明細)、Production.Product(產品)。
SalesOrderDetail 中找含產品編號 FW% 的明細行。SalesOrderHeader 取得 SalesPersonID。Employee 取得 ContactID。Contact 取得姓名。USE AdventureWorks;
GO
SELECT DISTINCT c.LastName, c.FirstName
FROM Person.Contact c
JOIN HumanResources.Employee e ON e.ContactID = c.ContactID
WHERE e.EmployeeID IN (
SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN (
SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN (
SELECT ProductID
FROM Production.Product
WHERE ProductNumber LIKE 'FW%'
)
)
);
GO
IN (SELECT ...) 可直接嵌套多層,形成清晰的「俄羅斯套娃」結構。IN 子查詢轉為半連接,效能通常不差。EXISTS 或 JOIN 並配合適當索引。嵌套子查詢是將複雜多表邏輯模組化的利器。養成「由內而外」的思維:先寫最內層的資料源頭查詢,再逐層包裹,最後在最外層投影所需欄位。配合 DISTINCT、IN/EXISTS、標準連接,能寫出既易讀又高效的 SQL。