Per iniziare, se diamo l'errore completo, dovrebbe leggere "Ogni espressione GROUP BY deve contenere almeno una colonna che non sia un riferimento esterno. "
Per comprendere l'errore, dobbiamo chiarire cosa si intende per 'riferimento esterno'
(Nota:in questo caso non ha nulla a che fare con join interni o esterni)
L'interno e esterno sono in riferimento alla query principale e alle sue sottoquery. In questo caso EXISTS
è la sottoquery ed è una correlata subquery in quanto ha un riferimento esterno di #header.header
, che fa riferimento alla tabella esterna #header
, mentre qualsiasi riferimento a #detail
sarebbero considerati riferimenti interni.
Quindi, in sostanza, perché il CASE
utilizza una sottoquery correlata che fa riferimento alla query esterna, quindi viene attivato lo stato di errore, poiché questo messaggio di errore viene visualizzato quando si tenta di utilizzare solo espressioni in una clausola GROUP BY interpretate come riferimenti esterni.
Le sottoquery possono essere utilizzato in GROUP BY, ma non nelle sottoquery correlate.
In modo confuso, lo stesso errore può essere generato da una query più semplice non sottoposta a subquery come
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 anche sostituendo la costante con una @variable
Chiaro come fango?
Kev