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

6 Cara Menghapus Baris Duplikat yang memiliki Kunci Utama di SQLite

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 Johnson  

Kita 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 Johnson 

Tabel telah ditipu seperti yang diharapkan.

Sebagai alternatif, kita dapat menggunakan MAX() fungsi alih-alih MIN() 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 Johnson 

Tabel sekarang telah ditipu.

Perhatikan bahwa saya menggunakan MAX() fungsi alih-alih MIN() 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() atau MAX() :

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 Johnson 

Opsi 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 Johnson 

Opsi 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-alih DogId 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 Johnson 

Opsi 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 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sqlite tidak memasukkan data di tabel ke-2

  2. IntentService membekukan UI aplikasi saya

  3. Mencoba membuka kembali objek sqlitedatabase yang sudah ditutup

  4. Buat kunci komposit secara otomatis di SQLite

  5. Menampilkan data dari database menggunakan adaptor dasar dan tampilan daftar