Wenn ich das tue
%Vor%Die Ausgabe ist:
%Vor% Die Abfrage scheint bei Verwendung von ORDER BY
mit nicht-deterministischer Sortierung ( NULL
oder eine Konstante) alphanumerisch sortiert zu sein und hat die Eingabeordnung bei Verwendung von ORDER BY ROWNUM
(deterministisch) beibehalten.
In der Dokumentation LISTAGG
heißt es:
Die Anweisung order_by_clause bestimmt die Reihenfolge, in der die verketteten Werte zurückgegeben werden. Die Funktion ist nur deterministisch, wenn die ORDER BY-Spaltenliste eine eindeutige Reihenfolge erreicht hat.
Und wenn man analytische Funktionen betrachtet, heißt es:
Wenn die Anweisung order_by_clause für mehrere Zeilen identische Werte ergibt, verhält sich die Funktion wie folgt: [...] Bei allen anderen analytischen Funktionen hängt das Ergebnis von der Fensterspezifikation ab. Wenn Sie ein logisches Fenster mit dem Schlüsselwort RANGE angeben, gibt die Funktion für jede der Zeilen dasselbe Ergebnis zurück. Wenn Sie ein physisches Fenster mit dem Schlüsselwort ROWS angeben, ist das Ergebnis nicht deterministisch.
Soweit ich aus der Dokumentation ersehen kann, ist eine nicht-deterministische Ordnung zu erwarten - die Funktion liefert jedoch eine deterministische Ausgabe, die auf einer alphanumerischen Sortierung basiert und nicht auf der Reihenfolge, in der die Zeilen verarbeitet werden die allgemein gehaltene Ansicht ).
Dies unterscheidet sich vom Verhalten anderer analytischer Funktionen (bei Verwendung eines physischen Fensters mit dem Schlüsselwort ROWS
):
Dies gibt eine konsistente Ausgabe für alle verschiedenen Ordnungen:
%Vor% Gibt es eine offizielle Dokumentation darüber, wie eine Bestellung angewendet wird, wenn LISTAGG
eine nicht-deterministische Bestellung liefert?
Hinweis: Das Verhalten von ORDER BY NULL
wird in hier kommentiert:
In diesem Beispiel wurden die Elemente trotz der NULL-Sortierklausel alphabetisch zusammengefasst. Dies scheint das Standardverhalten zu sein, wenn Sie einen konstanten ORDER BY-Ausdruck verwenden
Aber das ist nur ein Kommentar zum Verhalten in einer Nicht-Oracle-Site.
Möglicherweise hängt die Reihenfolge von vielen Faktoren ab, einschließlich des Ausführungsplans der Abfrage, der Konfiguration Ihrer Instanz, der Version der Datenbank, wenn Sie sich auf Exadata befinden oder nicht.
Wenn Sie oracle keine spezifischen Kriterien für die Bestellung der Daten geben, können Sie sich nicht auf eine bestimmte Bestellung verlassen, selbst wenn Sie aus Ihren Versuchen scheinbar die Daten konsistent auf eine bestimmte Art sortieren.
Laut Oracle Dokumentation für Listagg :
Tags und Links oracle sql-order-by listagg