2016-07-01 6 views
0

Ich habe eine Student Tabelle mit 8 Datensätzen in Spalten [Name, Adresse, TotalFees].ORDER BY Abfrage mit zwei verschiedenen Ausgaben

Obwohl ich zwei gleiche ORDER BY Abfragen auf einzelne Tabelle ausführen, bekomme ich zwei verschiedene Ausgänge. Ich habe den Screenshot unten angehängt.

gleiche Abfrage auf einem Tisch mit verschiedener Ausgabe:

enter image description here

+5

Beide sind Ergebnisse im Einklang mit den Garantien produzieren, die Sie * * in Ihrem 'ORDER BY' angefordert. Wenn Sie stärkere Garantien wünschen, * müssen * Sie sie anfordern, indem Sie zusätzliche Spalte (n) oder Ausdrücke zu diesem 'ORDER BY' hinzufügen. –

+0

Dies ist ein sehr gutes Beispiel, dass es ** absolut keine implizite Sortierreihenfolge gibt ** Jeder Aufruf kann mit einer anderen Reihenfolge kommen, solange Ihre Spalten für 'ORDER BY' in ihren kombinierten Werten nicht 'UNIQUE' sind. – Shnugo

+0

... und was ist deine Frage? – Thinkeye

Antwort

2

Das Problem, das Sie haben, ist, dass die Schlüssel für die order by nicht jede Zeile eindeutig definieren. Insbesondere wird "khar" für die meisten Zeilen wiederholt (Ihre Ergebnisse legen nahe, dass Sie eine Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung verwenden).

In SQL-Datenbanken ist die Sortierung nicht stabil. Bei einer stabilen Sortierung wird die ursprüngliche Reihenfolge der Werte mit demselben Schlüssel beibehalten. Da die Sortierung nicht stabil ist, können die Ergebnisse - für identische Schlüssel - in beliebiger Reihenfolge ausgegeben werden.

Warum ist die Sorte nicht stabil? Das ist im Nachhinein leicht. SQL-Tabellen und Ergebnismengen stehen für ungeordnete Sets. Es gibt keine anfängliche Reihenfolge, daher ist die Sortierung nicht stabil.

Der normale Weg, dies zu beheben, ist eine eindeutige ID als der letzte Schlüssel in der order by: order by address, id. Mit Ihren Daten ist es jedoch unklar, was der eindeutige Schlüssel ist.

+0

** Aber meine einzige Sorge ist, dass das # 3. Ergebnis in der zweiten Ausgabetabelle ändert, wenn ich nur Top 3 Werte aus der ersten Ausgabetabelle widerspiegeln möchte. ** –

+0

@NiKhilKutewalla. . . Da die 'order by'-Funktion doppelte Werte für die Schlüssel enthält, kann sie bei jeder Ausführung unterschiedliche Ergebnisse liefern. Ich denke, das erklärt, was passiert. –

0

Kombination von Adresse und Name werden Duplikate nicht produzieren, so dass Sie diese versuchen können,

select *From student 
order by address,name 

select top 3 * From student 
order by address,name 
+0

** Aber meine einzige Sorge ist, dass das # 3. Ergebnis in der zweiten Ausgabetabelle ändert, wenn ich nur Top 3 Werte aus der ersten Ausgabetabelle widerspiegeln möchte. ** –

Verwandte Themen