Tho*_*anz 3 sql-server t-sql sql-server-2014 sql-server-2016
任何想法,为什么以下查询中的第一个返回带有 -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
Run Code Online (Sandbox Code Playgroud)
没有 a 的聚合查询GROUP BY
是标量聚合并且(在没有任何HAVING
子句的情况下)只返回一行。
所以如果你这样做
SELECT COUNT(*)
FROM EmptyTable
Run Code Online (Sandbox Code Playgroud)
或者
SELECT COUNT(*)
FROM SomeOtherTable
WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)
两者都将返回值0
而不是空结果集。
如果添加GROUP BY
它,则它会成为向量聚合并每组返回一行(因此在上面的示例中将不返回任何内容)-请参阅向量和标量聚合
您的第一个查询仅由@i
添加到SELECT
列表中的标量聚合组成,因此您可以获得单行。第二个查询没有任何类型的聚合,也没有匹配的,WHERE
所以你没有行。
进一步阅读