KEMASKINI Oracle dengan INNER JOIN: Mengelakkan ORA-00933
Apabila mengemas kini jadual Oracle menggunakan cantuman dalaman, ralat biasa ialah ORA-00933: "Arahan SQL tidak ditamatkan dengan betul." Ini timbul daripada penggunaan sintaks yang salah. Sintaks UPDATE ... INNER JOIN ... SET ...
standard yang digunakan dalam pangkalan data lain seperti MySQL tidak berfungsi secara langsung dalam Oracle.
Masalah dan Penyelesaian Oracle
Sintaks yang bermasalah kelihatan seperti ini:
<code class="language-sql">UPDATE table1 INNER JOIN table2 ON table1.value = table2.DESC SET table1.value = table2.CODE WHERE table1.UPDATETYPE='blah';</code>
Oracle memerlukan pendekatan yang berbeza. Inilah kaedah yang betul:
<code class="language-sql">UPDATE table1 SET table1.value = (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC) WHERE table1.UPDATETYPE='blah' AND EXISTS (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC);</code>
Ini menggunakan subkueri untuk mengambil nilai table2.CODE
untuk kemas kini dan klausa EXISTS
untuk memastikan kemas kini hanya berlaku apabila baris yang sepadan wujud dalam table2
. Ini menghalang ralat yang disebabkan oleh percubaan untuk mengemas kini dengan nilai yang tidak wujud.
Kaedah Alternatif: Pandangan Sebaris
Pilihan lain melibatkan penggunaan paparan sebaris:
<code class="language-sql">UPDATE (SELECT table1.value as OLD, table2.CODE as NEW FROM table1 INNER JOIN table2 ON table1.value = table2.DESC WHERE table1.UPDATETYPE='blah' ) t SET t.OLD = t.NEW;</code>
Kejayaan kaedah ini bergantung pada sama ada Oracle menganggap paparan sebaris boleh dikemas kini, yang dikawal oleh peraturan pangkalan data tertentu. Kaedah sebelumnya biasanya lebih dipercayai. Pilih kaedah yang paling sesuai dengan keperluan anda dan sentiasa menguji dengan teliti.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Jadual dengan Betul dengan Inner Joins dalam Oracle untuk Mengelakkan ORA-00933?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!