Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Aufruf Max. Zeilennummer aus einer temporären Tabelle

TEMP_TABLE fehlt ein sequenzieller Primärschlüssel oder ein anderer Indikator für die Reihenfolge des Einfügens. Daher ist es nicht möglich, die neueste ID für ein LOAD mithilfe der Spalten der Tabelle selbst zu erhalten.

Es gibt jedoch eine Option:ORA_ROWSCN() . Dies ist eine Pseudospalte, die die Systemänderungsnummer für die Transaktion identifiziert was den Tisch verändert hat. Wir können also die Reihenfolge des Einfügens rekonstruieren, indem wir die Tabelle nach ORA_ROWSCN.

sortieren

Es gibt einige Vorbehalte:

  1. Standardmäßig gilt der SCN für die Blockebene. Folglich haben alle Zeilen in einem Block denselben SCN. Es ist eine ausreichend gute Annäherung für breite Tabellen, aber hoffnungslos für ein zweispaltiges Spielzeug wie TEMP_TABLE. Wir können SCN auf Zeilenebene verfolgen, aber nur, wenn die Tabelle mit ROWDEPENDENCES erstellt wird. Der Standardwert ist NOROWDEPENDENCES. Leider können wir ALTER TABLE hier nicht verwenden. Sie müssen die Tabelle löschen und neu erstellen (*) um ROWDEPENDENCES zu aktivieren.
  2. Der SCN gilt für die Transaktion. Das bedeutet, dass die Lösung nur funktioniert, wenn jede Zeile in TEMP_TABLE in eine separate Transaktion eingefügt wird.
  3. Offensichtlich ist dies nur möglich, wenn TEMP_TABLE eine tatsächliche Tabelle ist und keine Ansicht oder ein anderes Konstrukt.

Wenn alle diese Kriterien erfüllt sind, ist hier eine Abfrage, die Ihnen die gewünschte Ergebnismenge liefert:

select load, id
from ( select load
              , id
              , row_number() over (partition by load order by ora_rowscn desc) as rn
       from temp_table
)
where rn = 1

Es gibt eine Demo auf db<>fiddle . Außerdem wird dieselbe Demo außer TEMP_TABLE mit NOROWDEPENDENCIES definiert, was das falsche Ergebnis erzeugt .

(*) Wenn Sie die Daten in TEMP_TABLE behalten müssen, gehen Sie wie folgt vor:

  1. rename TEMP_TABLE to whatever;
  2. create table TEMP_TABLE as select * from whatever rowdependencies;
  3. drop table whatever;

Der SCN ist jedoch für die vorhandenen Zeilen gleich. Wenn das wichtig ist, müssen Sie jede Zeile einzeln einfügen, in der Reihenfolge, die Sie beibehalten möchten, und nach jeder Einfügung bestätigen.