MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

2 Cara Menghapus Baris Duplikat di MariaDB (Mengabaikan Kunci Utama)

Berikut adalah contoh penghapusan baris duplikat dari tabel di MariaDB ketika baris tersebut memiliki kunci utama atau kolom pengenal unik.

Contoh menghapus baris duplikat tetapi menyimpannya. Jadi dalam kasus dua baris yang identik, itu menghapus salah satunya dan menyimpan yang lain.

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      | Robinson |
|     5 | Wag       | Johnson  |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

Kita dapat melihat bahwa dua baris pertama adalah duplikat, begitu juga dengan 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 artikel ini kami mengabaikan kunci utama, dan kami mendeteksi nilai duplikat di kolom yang tersisa.

Opsi 1

Mari kita mulai opsi pertama kita dengan memilih semua baris yang akan dihapus:

SELECT * FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Hasil:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     2 | Bark      | Smith    |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

Untuk menghapus baris duplikat tersebut, kita dapat mengganti SELECT * untuk DELETE :

DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Hasil:

Query OK, 3 rows affected (0.017 sec)

Dan untuk memverifikasi hasilnya, kita dapat memilih semua baris yang tersisa di tabel:

SELECT * FROM Dogs;

Hasil:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Sebagai alternatif, kita dapat menggunakan MAX() fungsi alih-alih MIN() berfungsi untuk mengubah baris mana yang dihapus.

Opsi 2

Dalam contoh ini kita akan menganggap bahwa tabel telah dikembalikan ke keadaan semula (dengan duplikat).

Kita dapat menggunakan kueri berikut untuk memeriksa baris duplikat:

SELECT * 
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
);

Hasil:

+-------+-----------+----------+-------+-----------+----------+
| DogId | FirstName | LastName | DogId | FirstName | LastName |
+-------+-----------+----------+-------+-----------+----------+
|     2 | Bark      | Smith    |     1 | Bark      | Smith    |
|     7 | Wag       | Johnson  |     5 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |     6 | Wag       | Johnson  |
+-------+-----------+----------+-------+-----------+----------+

Dan kita dapat memodifikasi kueri itu untuk menghapus duplikatnya:

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 MIN(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

Hasil:

Query OK, 3 rows affected (0.075 sec)

Tabel sekarang telah ditipu.

Kami dapat memverifikasi ini dengan memilih semua baris lagi:

SELECT * FROM Dogs;

Hasil:

+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Kita bisa menggunakan MAX() bukannya MIN() untuk menghapus baris lain dari duplikat jika diinginkan.


  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 CONV() Bekerja di MariaDB

  2. Fungsi AVG() di MariaDB

  3. MariaDB CURRENT_DATE() Dijelaskan

  4. Bagaimana SUARA SEPERTI Bekerja di MariaDB

  5. Cara Menghitung Usia di MariaDB