MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

2 sposoby na usunięcie zduplikowanych wierszy w MariaDB (ignoruje klucz podstawowy)

Oto przykłady usuwania zduplikowanych wierszy z tabeli w MariaDB, gdy te wiersze mają klucz podstawowy lub kolumnę unikatowego identyfikatora.

Przykłady usuwają zduplikowane wiersze, ale zachowują jeden. Czyli w przypadku dwóch identycznych wierszy usuwa jeden z nich i zachowuje drugi.

Przykładowe dane

Nasze przykłady wykorzystują następujące dane:

SELECT * FROM Dogs;

Wynik:

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

Widzimy, że pierwsze dwa wiersze są duplikatami, podobnie jak ostatnie trzy wiersze.

DogId kolumna przechowuje unikalne wartości (ponieważ jest to klucz podstawowy tabeli), a zatem, ściśle mówiąc, nie ma duplikatów. Jednak w rzeczywistych sytuacjach często będziesz chciał usunąć duplikaty tabel zawierających klucze podstawowe. Dlatego w tym artykule ignorujemy klucz podstawowy i wykrywamy zduplikowane wartości w pozostałych kolumnach.

Opcja 1

Zacznijmy naszą pierwszą opcję od zaznaczenia wszystkich wierszy, które zostaną usunięte:

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

Wynik:

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

Aby usunąć te zduplikowane wiersze, możemy przełączyć SELECT * do DELETE :

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

Wynik:

Query OK, 3 rows affected (0.017 sec)

Aby zweryfikować wynik, możemy zaznaczyć wszystkie pozostałe wiersze w tabeli:

SELECT * FROM Dogs;

Wynik:

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

Możemy alternatywnie użyć MAX() funkcja zamiast MIN() funkcja do zmiany, które wiersze są usuwane.

Opcja 2

W tym przykładzie założymy, że tabela została przywrócona do swojego pierwotnego stanu (z duplikatami).

Do sprawdzenia zduplikowanych wierszy możemy użyć następującego zapytania:

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

Wynik:

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

Możemy zmodyfikować to zapytanie, aby usunąć duplikaty:

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

Wynik:

Query OK, 3 rows affected (0.075 sec)

Tabela została usunięta z kopii.

Możemy to zweryfikować, wybierając ponownie wszystkie wiersze:

SELECT * FROM Dogs;

Wynik:

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

Możemy użyć MAX() zamiast MIN() aby usunąć inne wiersze z duplikatów, jeśli jest to preferowane.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB JSON_DEPTH() Objaśnienie

  2. MariaDB ROUND() a OBCIĄŻENIE()

  3. Jak działa IFNULL() w MariaDB

  4. MariaDB JSON_KEYS() Objaśnienie

  5. Zabezpieczanie kopii zapasowych MySQL:przewodnik