Opsi berikut dapat digunakan untuk menghapus baris duplikat di SQLite.
Contoh-contoh ini menghapus baris duplikat tetapi tetap mempertahankannya. Jadi jika ada tiga baris yang identik misalnya, itu menghapus dua di antaranya dan menyimpan satu. Ini sering disebut sebagai de-duping tabel.
Contoh Data
Misalkan kita memiliki tabel dengan data berikut:
SELECT * FROM Pets;
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Kita dapat melihat bahwa dua baris pertama adalah duplikat, seperti halnya tiga baris terakhir.
Dalam hal ini, semua kolom adalah duplikat. Tidak ada kunci utama. PetId
kolom mungkin terlihat seperti itu bisa menjadi kunci utama, tetapi sebenarnya berisi nilai duplikat. Oleh karena itu, ini bukan pengidentifikasi unik untuk setiap baris, dan tidak dapat digunakan sebagai kunci utama.
Jika ada kunci utama, itu akan berisi nilai unik di semua baris, dan tidak akan ada duplikat.
Bagaimanapun, di bawah ini adalah dua opsi untuk menemukan dan menghapus baris duplikat.
Opsi 1
Sebelum kita melakukan de-dupe tabel, kita dapat menggunakan query berikut untuk melihat baris mana yang akan dihapus:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Ini menunjukkan kepada kita bahwa tiga baris akan dihapus saat kita menghapus penipuan tabel pada langkah berikutnya.
Untuk menghapus nilai duplikat, kita dapat mengubah kueri di atas dengan mengganti SELECT *
dengan DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabel sekarang telah ditipu.
Seperti yang diharapkan, salah satu baris duplikat untuk anjing kami "Wag" telah dihapus dan yang lainnya tetap ada. Dua baris duplikat untuk "Bark" juga telah dihapus.
Alasan kami dapat melakukan ini adalah karena rowid
SQLite . Secara default, setiap baris di SQLite memiliki kolom khusus, biasanya disebut rowid
, yang secara unik mengidentifikasi baris tersebut di dalam tabel. Kecuali jika telah dihapus secara eksplisit dari tabel, Anda dapat menggunakan ini sebagai pengenal unik untuk setiap baris, yang memungkinkan kami membuat kueri di atas. Hal yang sama berlaku untuk contoh berikutnya.
Opsi 2
Dengan asumsi tabel telah dipulihkan dengan data aslinya (termasuk baris duplikat), berikut adalah opsi lain untuk menghilangkan duplikasi.
Periksa baris mana yang akan dihapus:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Sekarang hapus baris tersebut:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Hasil:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabel telah ditipu.