SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

2 Cara Menghapus Baris Duplikat di SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana SQLite Quote() Bekerja

  2. Persatuan SQLite

  3. SQLITE tidak dapat memutakhirkan basis data hanya-baca dari versi 1 ke 2

  4. SQLiteDiskIOException:kode kesalahan 10:kesalahan disk I/O muncul kembali di ICS dan Samsung Nexus di DROP TABLE

  5. Ormlite atau sqlite Mana yang bagus untuk perspektif Android?