Di bawah ini adalah enam contoh yang menghapus baris duplikat dari tabel di SQLite ketika baris tersebut memiliki kunci utama atau kolom pengenal unik.
Dalam hal ini, kunci utama harus diabaikan saat membandingkan duplikat (karena fakta bahwa kunci utama mencegah baris duplikat menurut definisi).
Contoh Data
Contoh kami menggunakan data berikut:
SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 2 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag Johnson 6 Wag Johnson 7 Wag JohnsonKita dapat melihat bahwa dua baris pertama berisi duplikat, seperti halnya tiga baris terakhir.
DogId
kolom memegang nilai unik (karena itu adalah kunci utama tabel), dan oleh karena itu, secara tegas, tidak ada duplikat. Tetapi dalam situasi kehidupan nyata, Anda akan sering ingin menghapus tabel yang berisi kunci utama. Oleh karena itu, dalam contoh berikut, kami mengabaikan kunci utama dan menghapus baris yang berisi nilai duplikat di seluruh kolom yang tersisa.Opsi 1
Inilah opsi pertama kami untuk menghilangkan pemalsuan tabel di atas:
DELETE FROM Dogs WHERE DogId IN ( SELECT DogId FROM Dogs EXCEPT SELECT MIN(DogId) FROM Dogs GROUP BY FirstName, LastName ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag JohnsonTabel telah ditipu seperti yang diharapkan.
Sebagai alternatif, kita dapat menggunakan
MAX()
fungsi alih-alihMIN()
berfungsi untuk mengubah baris mana yang dihapus. Saya akan melakukan ini pada contoh berikutnya.Opsi 2
Dalam contoh ini (dan contoh berikut) kami akan menganggap bahwa tabel telah dikembalikan ke keadaan semula (dengan duplikat).
Berikut kueri lain yang menghapus baris duplikat dan memilih baris yang tersisa:
DELETE FROM Dogs WHERE DogId IN ( SELECT d2.DogId FROM Dogs d1, Dogs d2 WHERE d1.FirstName = d2.FirstName AND d1.LastName = d2.LastName AND d1.DogId <> d2.DogId AND d1.DogId=( SELECT MAX(DogId) FROM Dogs d3 WHERE d3.FirstName = d1.FirstName AND d3.LastName = d1.LastName ) ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------2 Bark Smith 3 Woof Jones 4 Ruff Robinson7 Wag JohnsonTabel sekarang telah ditipu.
Perhatikan bahwa saya menggunakan
MAX()
fungsi alih-alihMIN()
yang saya gunakan pada contoh sebelumnya. Kita dapat melihat pengaruhnya terhadap operasi de-duping. Itu menghapus baris yang berbeda dari tabel.Opsi 3
Berikut adalah opsi yang tidak memerlukan penggunaan
MIN()
atauMAX()
:DELETE FROM Dogs WHERE EXISTS ( SELECT 1 FROM Dogs d2 WHERE Dogs.FirstName = d2.FirstName AND Dogs.LastName = d2.LastName AND Dogs.DogId > d2.DogId ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag JohnsonOpsi 4
Ini opsi lain:
DELETE FROM Dogs WHERE DogId > ( SELECT MIN(DogId) FROM Dogs d2 WHERE Dogs.FirstName = d2.FirstName AND Dogs.LastName = d2.LastName ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag JohnsonOpsi 5
Secara default, setiap baris dalam 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 pengidentifikasi unik untuk setiap baris. Metode ini dapat berguna jika Anda tidak dapat mereferensikan kunci utama karena alasan tertentu (atau jika tabel tidak memiliki kunci utama).Oleh karena itu, kita dapat menggunakan
rowid
dalam kueri kami alih-alihDogId
kolom:DELETE FROM Dogs WHERE EXISTS ( SELECT 1 FROM Dogs d2 WHERE Dogs.FirstName = d2.FirstName AND Dogs.LastName = d2.LastName AND Dogs.rowid > d2.rowid ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag JohnsonOpsi 6
Dan inilah contoh lainnya, tetapi dengan
rowid
alih-alih kunci utama:DELETE FROM Dogs WHERE rowid > ( SELECT MIN(rowid) FROM Dogs d2 WHERE Dogs.FirstName = d2.FirstName AND Dogs.LastName = d2.LastName ); SELECT * FROM Dogs;
Hasil:
DogId FirstName LastName----- --------- --------1 Bark Smith 3 Woof Jones 4 Ruff Robinson5 Wag Johnson