WHERE EXISTS的机制

Mechanics of WHERE EXISTS

谁能告诉我为什么这两个查询 return 行数不同?

SELECT ProductSubcategoryID AS ProdSubID
FROM Production.Product
WHERE EXISTS ( 
    SELECT 1 
    FROM Production.Product 
    WHERE Weight IS NOT NULL 
)
SELECT ProductSubcategoryID AS ProdSubID
FROM Production.Product
WHERE Weight IS NOT NULL

Production.Product 可以在 AdventureWorks

中找到

这些与 where 子句中的谓词不同。

第一个查询将 return 在 Production.Product 中的每个 ProductSubcategoryID,只要至少有一条记录 Weight 不是 null

而第二个查询将 return 在 Production.Product 中的每个 ProductSubcategoryID,在同一行中,Weight 不是 null

为了使查询等效,第一个子查询中的子查询必须与外部查询相关联 - 您可以这样做:

SELECT ProductSubcategoryID AS ProdSubID
FROM Production.Product As p0
WHERE EXISTS ( 
    SELECT 1 
    FROM Production.Product As p1
    WHERE p1.<row identifier> = p0.<row identifier>
    AND Weight IS NOT NULL )

其中 <row identifier> 表示 table 中每一行的一个值(或一组值)是唯一的。