首頁
編程語言
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. 在 SalesOrderDetail 中找含產品編號 FW% 的明細行。
  2. 關聯 SalesOrderHeader 取得 SalesPersonID。
  3. 關聯 Employee 取得 ContactID。
  4. 關聯 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 ...) 可直接嵌套多層,形成清晰的「俄羅斯套娃」結構。
  • 標準化(Normalization)雖增加連接複雜度,但嵌套子查詢能將邏輯封裝,保持主查詢簡潔。
  • 當業務邏輯天然分層(如:產品→明細→主檔→人員)時,嵌套子查詢比多表連接更直觀。

效能提示

  • 現代優化器常將嵌套 IN 子查詢轉為半連接,效能通常不差。
  • 若子查詢返回大量行,考慮改用 EXISTS 或 JOIN 並配合適當索引。
  • 避免在相關子查詢中放入昂貴計算,否則會逐行重複執行。

總結

嵌套子查詢是將複雜多表邏輯模組化的利器。養成「由內而外」的思維:先寫最內層的資料源頭查詢,再逐層包裹,最後在最外層投影所需欄位。配合 DISTINCT、IN/EXISTS、標準連接,能寫出既易讀又高效的 SQL。

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