使用 EXISTS 的子查詢

當子查詢是以關鍵字 EXISTS 導入時,它可作為存在測試的子查詢函數。外部查詢的 WHERE 子句將測試子查詢所傳回的資料列是否存在。子查詢並未實際地產生任何資料;而是傳回 TRUE 或 FALSE 值。

EXISTS 所導入子查詢的語法如下:

WHERE [NOT] EXISTS (subquery)

下列查詢會尋找在 Wheels 子類別目錄之所有產品的名稱:

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
    (SELECT * 
     FROM Production.ProductSubcategory
     WHERE ProductSubcategoryID = 
            Production.Product.ProductSubcategoryID
        AND Name = 'Wheels')

以下為結果集:

Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel

(14 row(s) affected)

若要瞭解此查詢的結果,請依次考慮每個產品的名稱。此值是否可使子查詢至少傳回一個資料列?換句話說,查詢是否可使存在測試評估為 TRUE?

請注意 EXISTS 導入的子查詢和下列方式的其他子查詢有點不同:

  • 關鍵字 EXISTS 前面並沒有資料行名稱、常數或其他運算式。

  • EXISTS 提出的子查詢之選取清單一定會包含星號 (*)。您並不需要列出資料行名稱,因為您只是在測試是否有任何資料列符合子查詢所指定的條件。

EXISTS 關鍵字非常重要,因為沒有子查詢通常就沒有替代的形式。雖然有些以 EXISTS 建立的查詢並不能以任何其他方式來表示,但是許多查詢都可以使用 IN 或是 ANY 或 ALL 修改之比較運算子來達成類似的結果。

例如,前面的查詢可以使用 IN 來表示:

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')