需求:列出銷售「平墊圈」產品的業務人員姓名。資料分散四表:
Person.Contact(姓名)HumanResources.Employee(員工編號 ↔ ContactID)Sales.SalesOrderHeader(訂單 ↔ SalesPersonID)Sales.SalesOrderDetail(訂單明細 ↔ ProductID)Production.Product(產品編號 ↔ ProductNumber LIKE 'FW%')SELECT ProductID FROM Production.Product WHERE ProductNumber LIKE 'FW%'SELECT SalesOrderID FROM Sales.SalesOrderDetail WHERE ProductID IN (...)SELECT SalesPersonID FROM Sales.SalesOrderHeader WHERE SalesOrderID IN (...)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
SELECT DISTINCT c.LastName, c.FirstName
FROM Person.Contact c
JOIN HumanResources.Employee e ON e.ContactID = c.ContactID
JOIN Sales.SalesOrderHeader soh ON soh.SalesPersonID = e.EmployeeID
JOIN Sales.SalesOrderDetail sod ON sod.SalesOrderID = soh.SalesOrderID
JOIN Production.Product p ON p.ProductID = sod.ProductID
WHERE p.ProductNumber LIKE 'FW%';
| 面向 | 巢狀子查詢 | JOIN |
|---|---|---|
| 可讀性 | 邏輯層次分明,符合「由內而外」思維 | 關聯關係扁平,需熟悉資料模型 |
| 效能 | 舊版優化器可能產生重複掃描 | 現代優化器通常轉為相同計畫 |
| 除錯 | 可逐層獨立執行驗證 | 需整體執行 |
| 適用場景 | 階層式過濾、EXISTS/NOT EXISTS、動態 SQL 組裝 | 標準多表關聯、報表查詢 |
EXISTS (SELECT 1 FROM ...),避免 IN (SELECT ...) 產生 NULL 陷阱。WITH fw_products AS (
SELECT ProductID FROM Production.Product WHERE ProductNumber LIKE 'FW%'
),
fw_orders AS (
SELECT DISTINCT SalesOrderID FROM Sales.SalesOrderDetail WHERE ProductID IN (SELECT ProductID FROM fw_products)
),
fw_salespersons AS (
SELECT DISTINCT SalesPersonID FROM Sales.SalesOrderHeader WHERE SalesOrderID IN (SELECT SalesOrderID FROM fw_orders)
)
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 fw_salespersons);
巢狀子查詢是 SQL 邏輯分解的有力工具,但現代開發應以 JOIN 與 CTE 為主,保持查詢可維護與高效能。