TEMP_TABLE postrádá sekvenční primární klíč nebo jakýkoli jiný indikátor pro pořadí vložení. Není tedy možné získat nejnovější ID pro LOAD pomocí sloupců samotné tabulky.
Existuje však jedna možnost:ORA_ROWSCN() . Toto je pseudosloupec, který identifikuje číslo systémové změny pro transakci která změnila tabulku. Takže můžeme rekonstruovat pořadí vkládání seřazením tabulky na ORA_ROWSCN.
Existuje několik upozornění:
- Ve výchozím nastavení se SCN vztahuje na úroveň bloku. V důsledku toho mají všechny řádky v bloku stejné SCN. Je to dost dobrá aproximace pro široké tabulky, ale beznadějná pro hračku se dvěma sloupci, jako je TEMP_TABLE. SCN můžeme sledovat na úrovni řádků, ale pouze pokud je tabulka vytvořena pomocí ROWDEPENDENCIES. Výchozí hodnota je NOROWDEPENDENCIES. Bohužel zde nemůžeme použít ALTER TABLE. Budete muset zrušit a znovu vytvořit tabulku (*) pro povolení ŘÁDKOVÉ ZÁVISLOSTI.
- Na transakci se vztahuje SCN. To znamená, že řešení bude fungovat pouze v případě, že každý řádek v tabulce TEMP_TABLE bude vložen do samostatné transakce.
- To je samozřejmě možné pouze v případě, že TEMP_TABLE je skutečná tabulka a nikoli pohled nebo nějaká jiná konstrukce.
Vzhledem k tomu, že jsou všechna tato kritéria splněna, je zde dotaz, který vám poskytne požadovanou sadu výsledků:
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
K dispozici je ukázka na db<>fiddle
. Také stejné demo kromě TEMP_TABLE definované pomocí NOROWDEPENDENCIES, které