存在带有 HAVING 子句的子查询

Exists sub-query with a HAVING clause

我正在尝试了解 EXISTS 的工作原理。

以下查询基于 this 答案,它查询在 table 中有超过 1 条记录的所有 SalesOrderIDs,其中至少有一条记录有 OrderQty > 1ProductID = 777:

USE AdventureWorks2012;
GO
SELECT  SalesOrderID, OrderQty, ProductID
FROM    Sales.SalesOrderDetail s
WHERE   EXISTS
        (   SELECT  1
            FROM    Sales.SalesOrderDetail s2
            WHERE   s.SalesOrderID = s2.SalesOrderID
            GROUP BY SalesOrderID
            HAVING COUNT(*) > 1
            AND COUNT(CASE WHEN OrderQty > 1 AND ProductID = 777 THEN 1 END) >= 1
        );

我不明白的是:子查询 returns 是一个单列 table,每行都填充了值 1。所以我的理解是,外部查询中的 WHERE 没有真正的条件可以应用,只是一堆 1 。 Why\How,那么,外层查询returns只是Sales.SalesOrderDetail的一部分,而不是全部?

内在SELECT 1 ...不会一直return1.

当不满足内部 WHERE/HAVING 条件时,您将不会获得 1 returned。相反,什么都没有,我的意思是 SQL Server Management Studio(如果我没记错的话)将根本不显示任何结果,甚至内部 SELECT 1 的 NULL 也不会显示,因此整个外部 WHERE 对于那个特定的行。

因此,您的外部查询结果集的一部分将被截断,并且 return 使用 EXITS(...) 编辑的总行数将少于 EXISTS(...) 不存在时的总行数。

EXISTS 中发生的事情是,它只检查来自外部 table 的记录是否满足内部查询中给出的条件。这就是为什么我们指定“1”的原因与 IN 不同,在 IN 中我们需要指定各个列(并且会检查每条记录的数据)。

因此,它不会 return 任何一串 1 并对其进行验证。顾名思义,它仅根据给定条件检查记录是否存在。

希望这能说明问题。

注意:始终使用 table 列的别名以防止歧义。