SQL Server: Mencegah Rekod Pendua Semasa INSERT INTO SELECT
Memasukkan data dari satu jadual ke jadual lain dalam SQL Server memerlukan pertimbangan yang teliti untuk mengelakkan entri pendua. Ini penting apabila jadual destinasi sudah mengandungi data yang berpotensi bercanggah. Pertimbangkan contoh ini:
<code>Table1 ---------- ID Name 1 A 2 B 3 C Table2 ---------- ID Name 1 Z</code>
INSERT INTO SELECT
yang mudah akan gagal kerana pendua ID
(1). Walaupun kenyataan IF-ELSE
bersyarat boleh dilakukan, ia tidak cekap dan menyusahkan. Alternatif yang lebih cekap wujud:
Kaedah 1: Menggunakan NOT EXISTS
Ini biasanya pendekatan yang paling berkesan:
<code class="language-sql">INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 WHERE NOT EXISTS (SELECT id FROM TABLE_2 t2 WHERE t2.id = t1.id);</code>
Hanya baris dari Table1
yang ID
belum wujud dalam Table2
dimasukkan.
Kaedah 2: Menggunakan NOT IN
Kaedah ini menapis pendua semasa proses pemilihan:
<code class="language-sql">INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 WHERE t1.id NOT IN (SELECT id FROM TABLE_2);</code>
Pendekatan ini kurang cekap daripada NOT EXISTS
, terutamanya dengan set data yang besar.
Kaedah 3: Menggunakan LEFT JOIN
dan IS NULL
Ini biasanya kaedah yang paling tidak berkesan:
<code class="language-sql">INSERT INTO TABLE_2 (id, name) SELECT t1.id, t1.name FROM TABLE_1 t1 LEFT JOIN TABLE_2 t2 ON t2.id = t1.id WHERE t2.id IS NULL;</code>
A LEFT JOIN
mengenal pasti baris yang tidak sepadan; hanya mereka yang mempunyai nilai NULL
dalam Table2.id
dimasukkan.
Untuk prestasi optimum, terutamanya dengan set data yang besar, kaedah NOT EXISTS
disyorkan. Elakkan pendekatan LEFT JOIN
melainkan faktor lain menjadikannya lebih baik. Pilih kaedah yang paling sesuai dengan keperluan khusus anda dan saiz set data.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Mengelak Pendua Apabila Memasukkan Data Menggunakan SQL Server INSERT INTO SELECT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!