Oracle
 sql >> Database >  >> RDS >> Oracle

Chiamata SQL Numero massimo di riga da una tabella temporanea

TEMP_TABLE manca di una chiave primaria sequenziale o di qualsiasi altro indicatore per l'ordine di inserimento. Quindi non è possibile ottenere l'ultimo ID per un LOAD utilizzando le colonne della tabella stessa.

Tuttavia, c'è un'opzione:ORA_ROWSCN() . Questa è una pseudo-colonna che identifica il System Change Number per la transazione che ha cambiato la tavola. Quindi possiamo ricostruire l'ordine di inserimento ordinando la tabella su ORA_ROWSCN.

Ci sono alcuni avvertimenti:

  1. Per impostazione predefinita, l'SCN si applica al livello di blocco. Di conseguenza tutte le righe di un blocco hanno lo stesso SCN. È un'approssimazione abbastanza buona per tavoli larghi ma senza speranza per un giocattolo a due colonne come TEMP_TABLE. Possiamo tracciare SCN a livello di riga ma solo se la tabella viene creata con ROWDEPENDENCIES. L'impostazione predefinita è NOROWDEPENDENZE. Sfortunatamente, non possiamo usare ALTER TABLE qui. Dovrai eliminare e ricreare la tabella (*) per abilitare le DIPENDENZE DI RIGA.
  2. L'SCN si applica alla transazione. Ciò significa che la soluzione funzionerà solo se ogni riga in TEMP_TABLE viene inserita in una transazione separata.
  3. Ovviamente questo è possibile solo se TEMP_TABLE è una tabella reale e non una vista o qualche altro costrutto.

Dato che tutti questi criteri sono soddisfatti, ecco una query che ti darà il set di risultati che desideri:

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

C'è una demo su db<>violino . Inoltre, la stessa demo tranne TEMP_TABLE definito con NOROWDEPENDENCIES, che produce il risultato sbagliato .

(*) Se devi conservare i dati in TEMP_TABLE i passaggi sono:

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

Tuttavia, l'SCN sarà lo stesso per le righe esistenti. Se questo è importante dovrai inserire ogni riga una alla volta, nell'ordine che desideri conservare, e impegnarti dopo ogni inserimento.