TEMP_TABLEには、挿入順序を示す順次主キーまたはその他のインジケーターがありません。そのため、テーブル自体の列を使用してLOADの最新のIDを取得することはできません。
ただし、オプションが1つあります。 ORA_ROWSCN() 。これは、トランザクションのシステム変更番号を識別する疑似列です。 テーブルを変更しました。したがって、ORA_ROWSCNでテーブルを並べ替えることで、挿入の順序を再構築できます。
注意点がいくつかあります:
- デフォルトでは、SCNはブロックレベルに適用されます。したがって、ブロック内のすべての行は同じSCNを持ちます。幅の広いテーブルには十分な近似値ですが、TEMP_TABLEのような2列のおもちゃには絶望的です。 SCNは行レベルで追跡できますが、テーブルがROWDEPENDENCIESで作成されている場合に限ります。デフォルトはNOROWDEPENDENCIESです。残念ながら、ここではALTERTABLEを使用できません。テーブルを削除して再作成する必要があります(*) ROWDEPENDENCIESを有効にします。
- SCNはトランザクションに適用されます。これは、TEMP_TABLEの各行が個別のトランザクションに挿入された場合にのみソリューションが機能することを意味します。
- 明らかに、これはTEMP_TABLEが実際のテーブルであり、ビューやその他の構成ではない場合にのみ可能です。
これらすべての基準が満たされている場合、ここに必要な結果セットを提供するクエリがあります。
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
db <>fiddle のデモがあります 。また、NOROWDEPENDENCIESで定義されたTEMP_TABLEを除いて、同じデモで間違った結果が生成されます 。
(*) データをTEMP_TABLEに保持する必要がある場合の手順は、次のとおりです。
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
ただし、SCNは既存の行で同じになります。それが重要な場合は、保存したい順序で各行を一度に1つずつ挿入し、挿入するたびにコミットする必要があります。