sql >> Databáze >  >> RDS >> Oracle

SQL volání Max číslo řádku z dočasné tabulky

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

  1. 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.
  2. 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.
  3. 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é

  1. Vyberte různé uspořádané dvojice ze spojení tabulky seskupené podle posledního data události

  2. mysqldump přes SSH do místního počítače

  3. O prvku formátu RM v Oracle

  4. Porovnejte výsledek dvou tabulkových funkcí pomocí jednoho sloupce z každé