首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 巢狀子查詢實戰:從內而外的查詢思維

     編輯:關於SqlServer

許多開發人員對子查詢、特別是巢狀子查詢感到困惑。子查詢分「標準」與「相關」兩類:標準子查詢執行一次回傳結果給外層;相關子查詢隨外層每列執行一次。本文聚焦巢狀子查詢應用。

實戰案例:找出銷售「平墊圈」的業務人員

資料分散四張表:Person.Contact、HumanResources.Employee、Sales.SalesOrderHeader、Sales.SalesOrderDetail、Production.Product。

由內而外思考:

  1. 先從 Production.Product 找產品編號 LIKE 'FW%' 的 ProductID。
  2. 接著在 Sales.SalesOrderDetail 找含該產品的 SalesOrderID。
  3. 再由 Sales.SalesOrderHeader 取得 SalesPersonID。
  4. 最後連接 HumanResources.Employee → Person.Contact 取得姓名。

巢狀子查詢 SQL

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,視執行計畫而定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved