TEMP_TABLE tidak memiliki kunci primer berurutan atau indikator lain untuk urutan penyisipan. Jadi tidak mungkin mendapatkan ID terbaru untuk LOAD menggunakan kolom tabel itu sendiri.
Namun, ada satu opsi:ORA_ROWSCN() . Ini adalah kolom semu yang mengidentifikasi Nomor Perubahan Sistem untuk transaksi yang mengubah tabel. Jadi kita bisa merekonstruksi urutan penyisipan dengan menyortir tabel di ORA_ROWSCN.
Ada beberapa peringatan:
- Secara default, SCN berlaku untuk level blok. Akibatnya semua baris dalam blok memiliki SCN yang sama. Ini adalah perkiraan yang cukup baik untuk tabel lebar tetapi tidak ada harapan untuk mainan dua kolom seperti TEMP_TABLE. Kami dapat melacak SCN di tingkat baris tetapi hanya jika tabel dibuat dengan ROWDEPENDENCIES. Standarnya adalah NOROWDEPENDENCIES. Sayangnya, kami tidak dapat menggunakan ALTER TABLE di sini. Anda harus menghapus dan membuat ulang tabel (*) untuk mengaktifkan ROWDEPENDENCIES.
- SCN berlaku untuk transaksi. Ini berarti solusi hanya akan berfungsi jika setiap baris dalam TEMP_TABLE dimasukkan dalam transaksi terpisah.
- Jelas ini hanya mungkin jika TEMP_TABLE adalah tabel aktual dan bukan tampilan atau konstruksi lainnya.
Mengingat semua kriteria ini terpenuhi, berikut adalah kueri yang akan memberi Anda kumpulan hasil yang Anda inginkan:
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
Ada demo di db<>biola . Juga, demo yang sama kecuali TEMP_TABLE yang didefinisikan dengan NOROWDEPENDENCIES, yang menghasilkan hasil yang salah .
(*) Jika Anda perlu menyimpan data dalam TEMP_TABLE, langkah-langkahnya adalah:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
Namun, SCN akan sama untuk baris yang ada. Jika itu penting, Anda harus menyisipkan setiap baris satu per satu, dalam urutan yang ingin Anda pertahankan, dan komit setelah setiap penyisipan.