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 中每一行的一个值(或一组值)是唯一的。
谁能告诉我为什么这两个查询 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 中每一行的一个值(或一组值)是唯一的。