TEMP_TABLE nie ma sekwencyjnego klucza głównego ani żadnego innego wskaźnika kolejności wstawiania. Dlatego nie jest możliwe uzyskanie najnowszego identyfikatora LOAD przy użyciu kolumn samej tabeli.
Jest jednak jedna opcja:ORA_ROWSCN() . To jest pseudokolumna, która identyfikuje numer zmiany systemu dla transakcji który zmienił stół. Możemy więc zrekonstruować kolejność wstawiania, sortując tabelę według ORA_ROWSCN.
Istnieją pewne zastrzeżenia:
- Domyślnie SCN dotyczy poziomu bloku. W konsekwencji wszystkie wiersze w bloku mają ten sam SCN. To wystarczająco dobre przybliżenie dla szerokich stołów, ale beznadziejne dla dwukolumnowej zabawki, takiej jak TEMP_TABLE. SCN możemy śledzić na poziomie wiersza, ale tylko wtedy, gdy tabela jest utworzona za pomocą ROWDEPENDENCIES. Wartość domyślna to NOROWDEPENDENCIES. Niestety nie możemy tutaj użyć ALTER TABLE. Będziesz musiał usunąć i odtworzyć tabelę (*) aby włączyć ROWDEPENDENCIES.
- Numer SCN dotyczy transakcji. Oznacza to, że rozwiązanie będzie działać tylko wtedy, gdy każdy wiersz w TEMP_TABLE zostanie wstawiony w osobnej transakcji.
- Oczywiście jest to możliwe tylko wtedy, gdy TEMP_TABLE jest rzeczywistą tabelą, a nie widokiem lub inną konstrukcją.
Biorąc pod uwagę, że wszystkie te kryteria są spełnione, oto zapytanie, które da ci żądany zestaw wyników:
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
Jest demo na db<>fiddle . Również to samo demo, z wyjątkiem TEMP_TABLE zdefiniowanego za pomocą NOROWDEPENDENCIES, który daje błędny wynik .
(*) Jeśli chcesz zachować dane w TEMP_TABLE, wykonaj następujące czynności:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
Jednak SCN będzie taki sam dla istniejących wierszy. Jeśli to ma znaczenie, będziesz musiał wstawiać każdy wiersz pojedynczo, w kolejności, w jakiej chcesz zachować, i zatwierdzać po każdym wstawieniu.