存在带有 HAVING 子句的子查询
Exists sub-query with a HAVING clause
我正在尝试了解 EXISTS
的工作原理。
以下查询基于 this 答案,它查询在 table 中有超过 1 条记录的所有 SalesOrderID
s,其中至少有一条记录有 OrderQty > 1
和 ProductID = 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 列的别名以防止歧义。
我正在尝试了解 EXISTS
的工作原理。
以下查询基于 this 答案,它查询在 table 中有超过 1 条记录的所有 SalesOrderID
s,其中至少有一条记录有 OrderQty > 1
和 ProductID = 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 列的别名以防止歧义。