Was verwendet LISTAGG mit ORDER BY NULL eigentlich als Bestellkriterium?

11

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 ):

%Vor%

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.

    
MT0 02.03.2016, 12:34
quelle

1 Antwort

0

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 :

  • 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.
mic.sca 23.08.2016 13:52
quelle

Tags und Links