Alias ​​wird in OrderBy ignoriert

Wir haben zwei Tabellen in unserer Anwendung, die beide eine ShowOrder Spalte haben. Wir verwenden NHibernate in unserer Anwendung und mit HQL verbinden wir diese beiden Tabellen, die von ShowOrder der ersten Tabelle bzw. der zweiten Tabelle bestellt werden.

Hier ist eine vereinfachte Version meiner Abfrage:

 SELECT pr.Id as Id,pr.Title as Title, pr.ShowOrder as ShowOrder FROM Process pr INNER JOIN ProcessGroup prg ON pr.GroupId=prg.Id ORDER BY prg.ShowOrder,pr.ShowOrder 

Im Allgemeinen arbeitet unsere Anwendung problemlos. Aber wir haben eine alte Anwendung und eine Umwandlungsroutine, um ihre database in unsere neue Anwendungsdatenbank zu konvertieren.

Wenn wir eine alte database in unsere neue database umwandeln, wird ein Fehler auftreten, wenn der SQL-server die obige Abfrage ausführen möchte. Die exception sagt:

Eine Spalte wurde mehrmals in der Reihenfolge nach list angegeben

Wenn wir pr.ShowOrder ohne Alias ​​auswählen, ist alles in Ordnung.

Es scheint, dass wenn es einen ShowOrder Alias ​​in der ShowOrder gibt, ignoriert SQL server Tabellen-Aliase und nimmt an, dass pr.ShowOrder und prg.ShowOrder sind.

Solutions Collecting From Web of "Alias ​​wird in OrderBy ignoriert"

Dies ist eine Verhaltensänderung zwischen SQL server 2000 und SQL server 2005

https:

Dies ist ein Standardverhalten von ANSI SQL und wurde von SQL server ab der Version 2005 übernommen.

ORDER BY funktioniert nicht auf den Spaltenwerten aus den Quellentabellen (FROM-Klausel), sondern es funktioniert technisch NUR auf den Ausgangssäulenwerten in der SELECT-Klausel (**). Also, wenn du "ShowOrder" in der ORDER BY-Klausel sagst, ist es eigentlich mit dem ShowOrder-Wert in der Ausgabeliste (was random pr.ShowOrder ist). Wenn du beide ShowOrders verwenden möchtest, solltest du sie beide in die SELECT-Klausel mit verschiedenen Namen setzen.

Der Grund, der nicht bellt, wenn Sie die Quelltabellen-Aliasnamen verwenden (was technisch es sollte), ist für die Kompatibilität mit SQL server 2000, aber das ist eine gefährliche Kompatibilität. Egal welchen Alias-Namen Sie im ORDER BY verwenden, es ist eigentlich nur mit dem, der in der Ausgabeliste erscheint.

(** – und ja, es gibt pathe um ihn herum, aber sie sind dort meistens, um einige Kompatibilität mit früheren Versionen zu bieten. Du bist besser dran, nur mit dem Standard zu gehen).

Ein weiterer Grund für diesen Fehler könnte sein – die database-Kompatibilitätsstufe ist auf " 2000-Modus " eingestellt (dies kann passieren, nachdem Sie Ihren SQL server von 2000 auf 2005 oder höher aktualisieren).

Lösung:

"SQL Management Studio" – mit der rechten Maustaste auf die database – "properties" – "Optionen" – "Kompatibilitätsstufe" – auf 90 oder höher gesetzt.