Om te beginnen, als we de volledige fout geven, zou deze moeten lezen "Elke GROUP BY-expressie moet ten minste één kolom bevatten die geen buitenste verwijzing is. "
Om de fout te begrijpen, moeten we verduidelijken wat wordt bedoeld met een 'buitenste referentie'
(Opmerking:in dit geval heeft het niets te maken met binnenste of buitenste joins)
De innerlijke en buiten verwijzen naar de hoofdquery en de bijbehorende subquery's. In dit geval is de EXISTS
is de subquery en het is een gecorreleerde subquery omdat het een buitenste referentie heeft van #header.header
, die verwijst naar de buitenste tabel #header
, terwijl elke verwijzing naar #detail
zouden worden beschouwd als innerlijke referenties.
Dus in wezen, omdat de CASE
gebruikt een gecorreleerde subquery die verwijst naar de buitenste query, dan activeert dit de foutstatus, omdat deze foutmelding verschijnt wanneer u probeert om alleen expressies in een GROUP BY-clausule te gebruiken die worden geïnterpreteerd als buitenste verwijzingen.
Subquery's kunnen worden gebruikt in GROUP BY, maar niet in gecorreleerde subquery's.
Verwarrend genoeg kan dezelfde fout worden gegenereerd door een niet-subqueried, eenvoudigere query zoals
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'
of zelfs de constante vervangen door een @variable
Helder als modder?
Kev