Ich habe die folgende Abfrage in Postgres:Seltsame Bestellung Fehler (ist es ein Bug?) In Postgres, wenn zwei Spalten mit identischen Werten Bestellung
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC
LIMIT 20 OFFSET 0
Der Rekord im 20. Platz ist eine identische session_time auf dem 21. Rekord.
Diese Abfrage gibt 20 Ergebnisse zurück. Wenn Sie jedoch die Ergebnisse mit der gesamten Datenbank vergleichen, gibt die Abfrage das 1.-19. Ergebnis und das 21. Ergebnis zurück und überspringt den 20..
Diese Abfrage kann durch das Hinzufügen, „id“ in der Reihenfolge festgelegt werden:
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC, id
LIMIT 20 OFFSET 0
aber ich frage mich, wie dieser Fehler aufgetreten? Wie funktioniert die Bestellung von Postgres identisch mit Offsets und Limits? Ist es zufällig? Ist es ein Fehler mit Postgres?
Wenn Sie deterministische Ergebnisse wünschen, müssen Sie in Ihrer Bestellung einen einzigartigen Tiebreak enthalten. Es ist das gleiche wie überhaupt keine Ordnung zu haben und zu erwarten, dass die Ergebnisse in einer bestimmten Reihenfolge sortiert werden. Keine Garantie dafür. –
Worauf Sie sich beziehen, heißt eine stabile Sortierung. Bei einer stabilen Sortierung werden Datensätze in der ursprünglichen Reihenfolge gespeichert, wenn sie über übereinstimmende Schlüssel verfügen. Es gibt definitiv keine Notwendigkeit für eine stabile Sortierung in SQL. Ich würde mich in keinem Produkt darauf verlassen. Wie Martin vorschlägt, verwenden Sie eine andere Spalte als Tieferbrecher. –
Dies ist definitiv * nicht * ein Fehler - Sie haben nur nach 'session_time' gefragt, und der Planer wird Ihnen den schnellsten Plan geben, der das tut; es macht keine Annahmen darüber, was Sie sonst noch bestellen möchten, indem Sie nicht angeben. Nur zum Spaß, aktualisieren Sie eine dieser Zeilen (auch zu aktuellen Werten) und machen Sie einen 'SELECT' ohne eine' ORDER BY' Klausel. Wenn Sie Dinge in einer bestimmten Reihenfolge möchten, müssen Sie dies angeben. – kgrittn