Til at starte med, hvis vi giver den fulde fejl, bør den læse "Hvert GROUP BY-udtryk skal indeholde mindst én kolonne, der ikke er en ydre reference. "
For at forstå fejlen skal vi præcisere, hvad der menes med en 'ydre reference'
(Bemærk:i dette tilfælde har det intet at gøre med indre eller ydre sammenføjninger)
Det indre og ydre refererer til hovedforespørgslen og dens underforespørgsler. I dette tilfælde EXISTS
er underforespørgslen, og den er en korreleret underforespørgsel, da den har en ydre reference på #header.header
, som refererer til den ydre tabel #header
, hvorimod enhver henvisning til #detail
ville blive betragtet som indre referencer.
Så i det væsentlige fordi CASE
bruger en korreleret underforespørgsel, der refererer til den ydre forespørgsel, så udløser dette fejltilstanden, fordi denne fejlmeddelelse vises, når du prøver kun at bruge udtryk i en GROUP BY-sætning, der fortolkes som ydre referencer.
Underforespørgsler kan bruges i GROUP BY, men ikke korrelerede underforespørgsler.
Forvirrende nok kan den samme fejl genereres af en ikke-underforespurgt, enklere forespørgsel som f.eks.
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'
eller endda erstatte konstanten med en @variable
Klart som mudder?
Kev