Para empezar, si damos el error completo, debería decir "Cada expresión GROUP BY debe contener al menos una columna que no sea una referencia externa. "
Para comprender el error, debemos aclarar qué significa una 'referencia externa'
(Nota:en este caso no tiene nada que ver con las uniones internas o externas)
El interior y exterior se refieren a la consulta principal y sus subconsultas. En este caso, EXISTS
es la subconsulta y es una correlacionada subconsulta ya que tiene una referencia externa de #header.header
, que hace referencia a la tabla exterior #header
, mientras que cualquier referencia a #detail
serían considerados como referencias internas.
Entonces, en esencia, porque el CASE
utiliza una subconsulta correlacionada que hace referencia a la consulta externa, entonces esto activa el estado de error, porque este mensaje de error aparece cuando intenta usar solo expresiones en una cláusula GROUP BY que se interpretan como referencias externas.
Las subconsultas pueden usarse en GROUP BY, pero no en subconsultas correlacionadas.
De manera confusa, el mismo error puede ser generado por una consulta más simple no 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'
o incluso reemplazando la constante con un @variable
¿Claro como el barro?
Kev