WHERE 1 = 2 返回一行

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)

Mar*_*ith 6

没有 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所以你没有行。

进一步阅读

有趣的聚合 - 保罗怀特