存在的力学

时间:2018-07-23 21:57:58

标签: sql-server tsql where-clause exists

谁能告诉我为什么这两个查询没有返回相同数量的行?

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中找到

1 个答案:

答案 0 :(得分:4)

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

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

第二个查询将返回ProductSubcategoryID中的每个Production.Product,其中同一行中的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>表示表中每一行的唯一值(或一组值)。