sql >> Databasteknik >  >> RDS >> Oracle

SQL-anrop Max radnummer från en temporär tabell

TEMP_TABLE saknar en sekventiell primärnyckel eller någon annan indikator för insättningsordning. Så det är inte möjligt att få det senaste ID:t för en LOAD genom att använda kolumnerna i själva tabellen.

Det finns dock ett alternativ:ORA_ROWSCN() . Detta är en pseudo-kolumn som identifierar systemändringsnumret för transaktionen vilket ändrade tabellen. Så vi kan rekonstruera ordningen för infogning genom att sortera tabellen på ORA_ROWSCN.

Det finns några varningar:

  1. Som standard gäller SCN för blocknivån. Följaktligen har alla rader i ett block samma SCN. Det är tillräckligt bra för breda bord men hopplöst för en leksak med två kolumner som TEMP_TABLE. Vi kan spåra SCN på radnivå men bara om tabellen skapas med ROWDBEROENDE. Standard är NOROWDEPENDENSIES. Tyvärr kan vi inte använda ALTER TABLE här. Du måste släppa och återskapa tabellen (*) för att aktivera ROWDENDENCIES.
  2. SCN gäller för transaktionen. Detta innebär att lösningen bara fungerar om varje rad i TEMP_TABLE infogas i en separat transaktion.
  3. Självklart är detta bara möjligt om TEMP_TABLE är en faktisk tabell och inte en vy eller någon annan konstruktion.

Eftersom alla dessa kriterier är uppfyllda är här en fråga som ger dig den resultatuppsättning du vill ha:

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

Det finns en demo på db<>fiddle . Dessutom samma demo förutom TEMP_TABLE definierad med NOROWDEPENDENCIES, som

  1. Django förväntar sig felaktigt id-kolumn

  2. Saknas semikolon i radänden av JPA-genererat sql-skript

  3. 8 sätt att lägga till mikrosekunder till ett Datetime-värde i MariaDB

  4. Codeiginter mysql lagrar kinesiska tecken som frågetecken