TEMP_TABLE mangler en sekventiel primær nøgle eller enhver anden indikator for indsættelsesrækkefølge. Så det er ikke muligt at få det seneste ID for en LOAD ved at bruge kolonnerne i selve tabellen.
Der er dog én mulighed:ORA_ROWSCN() . Dette er en pseudo-kolonne, der identificerer systemændringsnummeret for transaktionen som ændrede tabellen. Så vi kan rekonstruere rækkefølgen af indsættelse ved at sortere tabellen på ORA_ROWSCN.
Der er nogle forbehold:
- Som standard gælder SCN for blokniveauet. Derfor har alle rækkerne i en blok samme SCN. Det er en god nok tilnærmelse til brede borde, men håbløst for et to-søjlet legetøj som TEMP_TABLE. Vi kan spore SCN på rækkeniveau, men kun hvis tabellen er oprettet med ROWDEPENDENCIES. Standard er NOROWDEPENDENSIES. Desværre kan vi ikke bruge ALTER TABLE her. Du bliver nødt til at slippe og genskabe tabellen (*) for at aktivere ROWDENDENCIES.
- SCN gælder for transaktionen. Det betyder, at løsningen kun vil fungere, hvis hver række i TEMP_TABLE er indsat i en separat transaktion.
- Dette er naturligvis kun muligt, hvis TEMP_TABLE er en faktisk tabel og ikke en visning eller en anden konstruktion.
Da alle disse kriterier er opfyldt, er her en forespørgsel, som vil give dig det resultatsæt, du ønsker:
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
Der er en demo på db<>fiddle
. Også den samme demo undtagen TEMP_TABLE defineret med NOROWDEPENDENCIES, som