sql >> Database >  >> RDS >> Oracle

SQL-aanroep Max rijnummer uit een tijdelijke tabel

TEMP_TABLE mist een sequentiële primaire sleutel of een andere indicator voor de volgorde van invoegen. Het is dus niet mogelijk om de laatste ID voor een LOAD te krijgen met behulp van de kolommen van de tabel zelf.

Er is echter één optie:ORA_ROWSCN() . Dit is een pseudo-kolom die het systeemwijzigingsnummer identificeert voor de transactie die de tafel veranderde. Dus we kunnen de volgorde van invoeging reconstrueren door de tabel te sorteren op ORA_ROWSCN.

Er zijn enkele kanttekeningen:

  1. Standaard is de SCN van toepassing op het blokniveau. Bijgevolg hebben alle rijen in een blok dezelfde SCN. Het is een goede benadering voor brede tafels, maar hopeloos voor speelgoed met twee kolommen zoals TEMP_TABLE. We kunnen SCN op rijniveau volgen, maar alleen als de tabel is gemaakt met ROWDEPENDENCIES. De standaardwaarde is NOROWDENDENDENCES. Helaas kunnen we ALTER TABLE hier niet gebruiken. U moet de tabel verwijderen en opnieuw maken (*) om ROWDEPENDENTIES in te schakelen.
  2. De SCN is van toepassing op de transactie. Dit betekent dat de oplossing alleen werkt als elke rij in TEMP_TABLE in een afzonderlijke transactie wordt ingevoegd.
  3. Natuurlijk is dit alleen mogelijk als TEMP_TABLE een echte tabel is en geen weergave of een andere constructie.

Aangezien aan al deze criteria is voldaan, is hier een zoekopdracht die u de gewenste resultatenset zal geven:

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

Er is een demo op db<>fiddle . Ook dezelfde demo behalve TEMP_TABLE gedefinieerd met NOROWDEPENDENCIES, die het verkeerde resultaat geeft .

(*) Als u de gegevens in TEMP_TABLE wilt bewaren, zijn de stappen:

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

De SCN is echter hetzelfde voor de bestaande rijen. Als dat van belang is, moet je elke rij één voor één invoegen, in de volgorde die je wilt behouden, en na elke invoeging vastleggen.




  1. Hoe Access 2019 werkt en hoe u ermee werkt

  2. Hoe kan ik twee procedures in één combineren om één tabel te vullen in plaats van dat elk van de twee procedures zijn eigen tabel vult?

  3. Mysql, PHP, zoeken naar meerdere woorden

  4. java opsomming en postgresql opsomming