Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2005-Fehler beim Gruppieren mit Unterabfrage

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 werden
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'

oder sogar die Konstante durch eine @variable ersetzen

Klar wie Schlamm?

Kev