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