2017-09-08 1 views
0

Ich habe dieses Problem seit Tagen durcheinander gebracht und habe gerade die Quelle meiner Probleme identifiziert - eine Order-by-Klausel funktioniert nicht wie erwartet.T-SQL-Reihenfolge nach - Datentypvorrang nicht wie erwartet

Das Skript geht so:

select * from my_table 
order by change_effective_date, unique_id desc 

change_effective_date ist ein Datetime-Feld, und unique_id ist ein int Feld.

Ich hatte erwartet, dass dies mir die letzte Zeile zuerst geben würde (d. H. Die Zeile mit dem höchsten Wert in change_effective_date). Allerdings gab es die älteste Zeile zuerst, und die unique_id war auch in aufsteigender Reihenfolge (diese IDs sind normalerweise sequenziell, so dass ich im Allgemeinen erwarte, dass sie der gleichen Reihenfolge wie die Daten folgen, obwohl dies nicht absolut zuverlässig ist).

Verwirrt, wandte ich mich an Google und festgestellt, dass Datentyp Rangfolge von Klauseln, mit untergeordneten Datentypen auf den höherrangigen Datentyp umgewandelt werden beeinflussen können: https://blog.sqlauthority.com/2010/10/08/sql-server-simple-explanation-of-data-type-precedence/

jedoch Datetime Vorrang vor int nimmt, so Es sollte auf diese Weise nicht beeinträchtigt werden.

Kurioser, wenn ich unique_id aus der order by-Klausel nehme, sortiert es die Daten in absteigender Reihenfolge perfekt. Ich möchte der order by-Klausel jedoch einen eindeutigen Bezeichner hinzufügen, da es möglicherweise mehrere Zeilen mit demselben Datum und später im Skript geben kann, bei dem ich die neueste identifizieren möchte (in diesem Fall wäre die eindeutige_id die Verknüpfung) -breaker, als würde ich davon ausgehen, dass es sequenziell ist).

Wenn jemand erklären kann, was hier passiert, würde ich es wirklich schätzen!

Danke.

Antwort

2
select * from my_table 
order by change_effective_date desc, unique_id desc 
+0

Vielen Dank !! Arbeitete eine Belohnung. Ich kann nicht glauben, dass ich das nicht gewusst habe (und ich frage mich, welche anderen "Ordnung nach" Missgeschicke in Skripten lauern, die ich in der Vergangenheit geschrieben habe ...). Wer weiß, ob dies auch für Oracle gilt? –

+1

Es sollte afaik – muasif80

+1

@ s.turn Ja. es ist das gleiche in Oracle auch. –

Verwandte Themen