Alguma ideia, por que a primeira das consultas a seguir retorna uma linha com -1, NULL, embora tenha um WHERE 1=2
?
Somente quando coloco a consulta em outra subconsulta ela funciona corretamente (e retorna um conjunto de resultados vazio).
Testado no Microsoft SQL Server 2014 e 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
Uma consulta agregada sem a
GROUP BY
é uma agregação escalar e (na ausência de qualquerHAVING
cláusula) retorna exatamente uma linha.Então se você fizer
Ou
Ambos retornariam o valor
0
em vez de um conjunto de resultados vazio.Se você adicionar um
GROUP BY
, ele se tornará um agregado vetorial e retornará uma linha por grupo (Então não retornaria nada nos exemplos acima) - Consulte Agregados vetoriais e escalaresSua primeira consulta consiste apenas em um agregado escalar
@i
adicionado àSELECT
lista para que você obtenha a única linha. A segunda consulta não tem agregados de nenhum tipo e nada corresponde aWHERE
, então você não obtém nenhuma linha.Leitura adicional
Diversão com Agregados - Paul White