Saya mendapatkan
ORA-30926: tidak bisa mendapatkan kumpulan baris yang stabil di tabel sumber
dalam kueri berikut:
MERGE INTO table_1 a
USING
(SELECT a.ROWID row_id, 'Y'
FROM table_1 a ,table_2 b ,table_3 c
WHERE a.mbr = c.mbr
AND b.head = c.head
AND b.type_of_action <> '6') src
ON ( a.ROWID = src.row_id )
WHEN MATCHED THEN UPDATE SET in_correct = 'Y';
Saya telah menjalankannya table_1
memiliki data dan juga saya telah menjalankan query dalam ( src
) yang juga memiliki data.
Mengapa kesalahan ini terjadi dan bagaimana cara mengatasinya?
Anda mungkin mencoba memperbarui baris tabel target yang sama beberapa kali. Saya baru saja mengalami masalah yang sama dalam pernyataan gabungan yang saya kembangkan. Pastikan pembaruan Anda tidak menyentuh catatan yang sama lebih dari satu kali dalam pelaksanaan penggabungan.
sumber
1) Identifikasi pernyataan gagal
atau
dan perhatikan file .trc di UDUMP ketika itu terjadi.
2) Setelah menemukan pernyataan SQL, periksa apakah itu benar (mungkin menggunakan menjelaskan rencana atau tkprof untuk memeriksa rencana eksekusi permintaan) dan menganalisis atau menghitung statistik pada tabel yang bersangkutan jika ini belum dilakukan. Indeks pembangunan kembali (atau menjatuhkan / menciptakan kembali) juga dapat membantu.
3.1) Apakah pernyataan SQL MERGE? mengevaluasi data yang dikembalikan oleh klausa USING untuk memastikan bahwa tidak ada nilai duplikat dalam bergabung. Ubah pernyataan gabungan untuk memasukkan klausa deterministik di mana
3.2) Apakah ini pernyataan UPDATE melalui tampilan? Jika demikian, coba populasikan hasil tampilan ke dalam tabel dan coba perbarui tabel secara langsung.
3.3) Apakah ada pemicu di atas meja? Coba nonaktifkan untuk melihat apakah masih gagal.
3.4) Apakah pernyataan tersebut mengandung tampilan yang tidak dapat digabungkan dalam 'Sub-Sub -eri'? Ini dapat menghasilkan baris duplikat yang dikembalikan jika kueri memiliki klausa "UNTUK DIPERBARUI". Lihat Bug 2681037
3.5) Apakah tabel memiliki kolom yang tidak digunakan? Menjatuhkan ini dapat mencegah kesalahan.
4) Jika memodifikasi SQL tidak menyembuhkan kesalahan, masalahnya mungkin dengan tabel, terutama jika ada baris dirantai. 4.1) Jalankan pernyataan 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE' pada semua tabel yang digunakan dalam SQL untuk melihat apakah ada korupsi dalam tabel atau indeksnya. 4.2) Periksa, dan hilangkan, setiap BARIS RANTAI atau dimigrasi di atas meja. Ada beberapa cara untuk meminimalkan ini, seperti pengaturan PCTFREE yang benar. Gunakan Catatan 122020.1 - Perangkaian Baris dan Migrasi 4.3) Jika tabel tersebut tambahan Indeks Terorganisir, lihat: Catatan 102932.1 - Memantau Baris Dirantai pada IOT
sumber
Apakah kesalahan hari ini pada 12c dan tidak ada jawaban yang sesuai (tidak ada duplikat, tidak ada ekspresi non-deterministik dalam klausa WHERE). Kasus saya terkait dengan kemungkinan penyebab kesalahan lainnya, menurut teks pesan Oracle (penekanan di bawah):
Penggabungan adalah bagian dari batch yang lebih besar, dan dieksekusi pada database langsung dengan banyak pengguna secara bersamaan. Tidak perlu mengubah pernyataan itu. Saya hanya melakukan transaksi sebelum penggabungan, kemudian menjalankan penggabungan secara terpisah, dan melakukan lagi. Jadi solusinya ditemukan dalam tindakan pesan yang disarankan:
sumber
NETWORK_LINK
parameter yang terhubung langsung ke basis data sumber) selama tahap pengumpulan statistik, dan catatan yang Anda sorot mungkin menjelaskannya. Untungnya hanya statistik yang terpengaruh.Kesalahan ini terjadi pada saya karena duplikat catatan (16K)
Saya mencoba dengan unik itu berhasil .
tetapi sekali lagi ketika saya mencoba bergabung tanpa masalah unik yang sama terjadi Kedua kalinya itu karena komit
setelah bergabung jika komit tidak dilakukan, kesalahan yang sama akan ditampilkan.
Tanpa unik, Kueri akan berfungsi jika komit diberikan setelah setiap operasi penggabungan.
sumber
Klarifikasi lebih lanjut untuk penggunaan DISTINCT untuk menyelesaikan kesalahan ORA-30926 dalam kasus umum:
Anda perlu memastikan bahwa kumpulan data yang ditentukan oleh klausa USING () tidak memiliki nilai duplikat dari kolom gabungan , yaitu kolom di klausa ON () .
Dalam contoh OP di mana klausa USING hanya memilih kunci, itu sudah cukup untuk menambahkan DISTINCT ke klausa USING. Namun, dalam kasus umum klausa USING dapat memilih kombinasi kolom kunci yang cocok dan kolom atribut untuk digunakan dalam klausa UPDATE ... SET. Oleh karena itu dalam kasus umum, menambahkan DISTINCT ke klausa USING masih akan memungkinkan baris pembaruan berbeda untuk kunci yang sama, dalam hal ini Anda masih akan mendapatkan kesalahan ORA-30926.
Ini adalah penjabaran dari jawaban DCookie dan poin 3.1 dalam jawaban Tagar, yang dari pengalaman saya mungkin tidak segera jelas.
sumber