Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Erro do SQL Server 2005 ao agrupar usando subconsulta


Para começar, se dermos o erro completo, ele deve ler "Cada expressão GROUP BY deve conter pelo menos uma coluna que não seja uma referência externa. "

Para entender o erro, precisamos esclarecer o que significa uma 'referência externa'

(Nota:neste caso não tem nada a ver com junções internas ou externas)

O interior e exterior estão em referência à consulta principal e suas subconsultas. Neste caso, o EXISTS é a subconsulta e é uma correlacionada subconsulta, pois tem uma referência externa de #header.header , que está referenciando a tabela externa #header , enquanto qualquer referência a #detail seriam considerados como referências internas.

Então, em essência, porque o CASE utiliza uma subconsulta correlacionada que faz referência à consulta externa, então isso aciona o estado de erro, porque essa mensagem de erro aparece quando você tenta usar apenas expressões em uma cláusula GROUP BY que são interpretadas como referências externas.

Subconsultas podem ser usado em GROUP BY, mas não em subconsultas correlacionadas.

Confusamente, o mesmo erro pode ser gerado por uma consulta mais simples e não subconsultada, como
select 
 case when header=1 then 1 
      else 0 
 end headeris1, 
 'constant' 
from #header 
group by case when header=1 then 1 else 0 end , 'constant'

ou até mesmo substituindo a constante por uma @variable

Claro como lama?

Kev