任何想法,为什么以下查询中的第一个返回带有 -1,NULL 的行,尽管它有一个WHERE 1=2
?
只有当我将查询放在另一个子查询中时,它才能正常工作(并返回一个空结果集)。
在 Microsoft SQL Server 2014 和 2016 上测试
DECLARE @i INT = 1
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
WHERE 1 = 2
SELECT s1.i, s1.mid
FROM (
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
) s1
WHERE 1 = 2
没有 a 的聚合查询
GROUP BY
是标量聚合,并且(在没有任何HAVING
子句的情况下)只返回一行。所以如果你这样做
或者
两者都将返回值
0
而不是空结果集。如果你添加一个
GROUP BY
它然后变成一个向量聚合并且每组返回一行(所以在上面的例子中不会返回任何东西) - 请参见向量和标量聚合您的第一个查询仅包含一个标量聚合并
@i
添加到SELECT
列表中,因此您可以获得单行。第二个查询没有任何类型的聚合,也没有匹配的,WHERE
所以你没有得到任何行。进一步阅读
聚合的乐趣 - Paul White