Wenn wir zunächst den vollständigen Fehler angeben, sollte dieser lauten:„Jeder GROUP BY-Ausdruck muss mindestens eine Spalte enthalten, die keine äußere Referenz ist. "
Um den Fehler zu verstehen, müssen wir klären, was mit einer 'äußeren Referenz' gemeint ist
(Anmerkung:in diesem Fall hat es nichts mit inneren oder äußeren Joins zu tun)
Das Innere und äußere beziehen sich auf die Hauptabfrage und ihre Unterabfragen. In diesem Fall ist EXISTS
ist die Unterabfrage und eine korrelierte Unterabfrage, da sie eine äußere Referenz von #header.header
hat , die auf die äußere Tabelle #header
verweist , wohingegen jeder Verweis auf #detail
als innere Referenzen betrachtet werden.
Also im Wesentlichen, weil der CASE
verwendet eine korrelierte Unterabfrage, die auf die äußere Abfrage verweist, dann löst dies den Fehlerzustand aus, weil diese Fehlermeldung erscheint, wenn Sie versuchen, nur Ausdrücke in einer GROUP BY-Klausel zu verwenden, die als äußere Referenzen interpretiert werden.
Unterabfragen können in GROUP BY, aber nicht in korrelierten Unterabfragen verwendet werden.
Verwirrenderweise kann derselbe Fehler auch durch eine nicht unterabgefragte, einfachere Abfrage wie
generiert werdenselect
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'
oder sogar die Konstante durch eine @variable
ersetzen
Klar wie Schlamm?
Kev