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

SQL Server 巢狀子查詢深度解析:從內而外的思維轉換

     編輯:關於SqlServer

兩類子查詢:標準 vs 相關

  • 標準子查詢:執行一次,結果回傳給外層查詢
  • 相關子查詢:外層每一行都重新執行一次

本文聚焦巢狀子查詢(子查詢中再包含子查詢),相關子查詢留待後續探討。

實戰場景:找出銷售「平墊圈」的業務員

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

關鍵洞見:由內而外思考,由外而內撰寫

  1. 最內層:Production.Product 以 ProductNumber LIKE 'FW%' 篩選平墊圈
  2. 向外連接 Sales.SalesOrderDetail 取得 SalesOrderID
  3. 再連接 Sales.SalesOrderHeader 取得 SalesPersonID
  4. 連接 HumanResources.Employee 取得 ContactID
  5. 最外層:連接 Person.Contact 取得姓名

完整 T-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 p
            WHERE ProductNumber LIKE 'FW%'
        )
    )
);
GO

巢狀子查詢的威力

  • IN() 參數可直接接受 SELECT 陳述式,多層套用即形成巢狀結構
  • 正規化雖增加聯結複雜度,但巢狀子查詢能將「跨多表的業務問題」拆解為單一邏輯單元,提升可讀性與維護性
  • 適用於「需要的資料分散在多表,必須層層串聯」的情境

效能提示

  • 確保子查詢的篩選欄位有索引支援
  • 考慮改寫為 JOIN 或 EXISTS 以利用查詢優化器的更佳執行計畫
  • 避免在大量資料集上使用深層巢狀,必要時拆解為暫存表或 CTE

結語

掌握「由內而外思考、由外而內撰寫」的巢狀子查詢思維,能將複雜多表查詢化繁為簡,是 T-SQL 進階必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved