Biasanya, Anda hanya akan bergabung dengan dua tabel.
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
Karena Anda mengkhawatirkan efisiensi, bagaimanapun
- Apakah
TEMP_TABLE
benar-benar meja sementara? Jika demikian, mengapa? Sangat jarang Oracle benar-benar perlu menggunakan tabel sementara sehingga membuat saya curiga bahwa Anda mungkin melakukan sesuatu yang tidak efisien untuk mengisi tabel sementara. - Mengapa Anda memiliki kursor
FOR
loop untuk memproses data dariTEMP_TABLE
? Pemrosesan baris demi baris adalah cara paling lambat untuk melakukan apa pun di PL/SQL sehingga umumnya akan dihindari jika Anda khawatir tentang efisiensi. Dari sudut pandang kinerja, Anda ingin memaksimalkan SQL sehingga daripada melakukan loop yang melakukan serangkaian baris tunggalINSERT
atauUPDATE
operasi, Anda akan melakukan satuINSERT
atauUPDATE
yang memodifikasi seluruh rangkaian baris. Jika Anda benar-benar perlu memproses data dalam potongan, di situlah koleksi PL/SQL dan pemrosesan massal akan berperan, tetapi itu tidak akan seefisien SQL biasa. - Mengapa Anda memiliki
DISTINCT
dalam kueri Anda terhadapTEMP_TABLE
? Apakah Anda benar-benar berharap akan ada duplikatbig_id
nilai yang tidak salah? Sebagian besar waktu, orang menggunakanDISTINCT
salah baik untuk menutupi masalah di mana data telah digabungkan secara tidak benar atau di mana Anda memaksa Oracle untuk melakukan pengurutan yang mahal untuk berjaga-jaga jika data yang salah dibuat di masa mendatang ketika batasan akan menjadi cara yang lebih tepat untuk melindungi diri Anda sendiri.