許多開發人員對子查詢、特別是巢狀子查詢感到困惑。子查詢分「標準」與「相關」兩類:標準子查詢執行一次回傳結果給外層;相關子查詢隨外層每列執行一次。本文聚焦巢狀子查詢應用。
資料分散四張表:Person.Contact、HumanResources.Employee、Sales.SalesOrderHeader、Sales.SalesOrderDetail、Production.Product。
由內而外思考:
Production.Product 找產品編號 LIKE 'FW%' 的 ProductID。Sales.SalesOrderDetail 找含該產品的 SalesOrderID。Sales.SalesOrderHeader 取得 SalesPersonID。HumanResources.Employee → Person.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 ...) 可直接以子查詢結果集作為篩選條件,多層巢狀即形成巢狀子查詢。JOIN 或 EXISTS,視執行計畫而定。