MariaDB
 sql >> база данни >  >> RDS >> MariaDB

2 начина за изтриване на дублиращи се редове в MariaDB (игнорира първичен ключ)

Ето примери за премахване на дублиращи се редове от таблица в MariaDB, когато тези редове имат първичен ключ или колона с уникален идентификатор.

Примерите изтриват дублиращи се редове, но запазват един. Така че в случай на два еднакви реда, той изтрива един от тях и запазва другия.

Примерни данни

Нашите примери използват следните данни:

SELECT * FROM Dogs;

Резултат:

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

Виждаме, че първите два реда са дублирани, както и последните три реда.

DogId колоната съдържа уникални стойности (защото е първичен ключ на таблицата) и следователно, строго погледнато, няма дубликати. Но в ситуации от реалния живот често ще искате да премахнете фалшивите таблици, които съдържат първични ключове. Следователно в тази статия игнорираме първичния ключ и откриваме дублиращи се стойности в останалите колони.

Опция 1

Нека започнем нашата първа опция, като изберете всички редове, които ще бъдат изтрити:

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

Резултат:

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

За да премахнем тези дублиращи се редове, можем да превключим SELECT * до DELETE :

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

Резултат:

Query OK, 3 rows affected (0.017 sec)

И за да проверим резултата, можем да изберем всички останали редове в таблицата:

SELECT * FROM Dogs;

Резултат:

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

Алтернативно можем да използваме MAX() функция вместо MIN() функция за промяна на кои редове се изтриват.

Опция 2

В този пример ще приемем, че таблицата е възстановена в първоначалното си състояние (с дубликатите).

Можем да използваме следната заявка, за да проверим за дублиращи се редове:

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

Резултат:

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

И можем да променим тази заявка, за да изтрием дубликатите:

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

Резултат:

Query OK, 3 rows affected (0.075 sec)

Таблицата вече е премахната.

Можем да проверим това, като изберем отново всички редове:

SELECT * FROM Dogs;

Резултат:

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

Можем да използваме MAX() вместо MIN() за да изтриете останалите редове от дубликатите, ако предпочитате.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 начина за отделяне на часове, минути и секунди от времева стойност в MariaDB

  2. Как да съкратите текст с многоточие в MariaDB

  3. Как работи UPPER() в MariaDB

  4. Как ADD_MONTHS() работи в MariaDB

  5. Как да разположите MariaDB клъстер за висока наличност