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

4 начина за избор на дублиращи се редове в MariaDB

Ако имате таблица, за която подозирате, че има дублиращи се редове във вашата MariaDB база данни, можете да използвате някоя от следните заявки, за да получите представа колко реда са дублирани.

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

Да предположим, че имаме таблица със следните данни:

SELECT * FROM Pets;

Резултат:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Първите два реда са дублирани, а последните три реда са дублирани.

Опция 1

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

SELECT 
    DISTINCT PetId, 
    COUNT(*) AS "Count"
FROM Pets
GROUP BY PetId
ORDER BY PetId;

Резултат:

+---------+---------+
| PetId   | Count   |
|---------+---------|
| 1       | 2       |
| 2       | 1       |
| 3       | 1       |
| 4       | 3       |
+---------+---------+

Можем да разширим SELECT списък, за да включите още колони, ако е необходимо:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY PetId;

Резултат:

+---------+-----------+-----------+---------+
| PetId   | PetName   | PetType   | Count   |
|---------+-----------+-----------+---------|
| 1       | Wag       | Dog       | 2       |
| 2       | Scratch   | Cat       | 1       |
| 3       | Tweet     | Bird      | 1       |
| 4       | Bark      | Dog       | 3       |
+---------+-----------+-----------+---------+

Алтернативно можем да го подредим по брой в низходящ ред, така че редовете с най-много дубликати да се показват първи:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY Count DESC;

Резултат:

+-------+---------+---------+-------+
| PetId | PetName | PetType | Count |
+-------+---------+---------+-------+
|     4 | Bark    | Dog     |     3 |
|     1 | Wag     | Dog     |     2 |
|     3 | Tweet   | Bird    |     1 |
|     2 | Scratch | Cat     |     1 |
+-------+---------+---------+-------+

Опция 2

Ако искаме само дублиращите се редове да бъдат изброени, можем да използваме HAVING клауза за изключване на недублиращи се редове:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
HAVING COUNT(*) > 1
ORDER BY PetId;

Резултат:

+-------+---------+---------+-------+
| PetId | PetName | PetType | Count |
+-------+---------+---------+-------+
|     1 | Wag     | Dog     |     2 |
|     4 | Bark    | Dog     |     3 |
+-------+---------+---------+-------+

Опция 3

Друг начин да го направите е да използвате ROW_NUMBER() функция с PARTITION BY клауза за номериране на изхода на резултатния набор.

SELECT 
    *, 
    ROW_NUMBER() OVER ( 
        PARTITION BY PetId, PetName, PetType 
        ORDER BY PetId, PetName, PetType
        ) AS Row_Number
FROM Pets;

Резултат:

+-------+---------+---------+------------+
| PetId | PetName | PetType | Row_Number |
+-------+---------+---------+------------+
|     1 | Wag     | Dog     |          1 |
|     1 | Wag     | Dog     |          2 |
|     2 | Scratch | Cat     |          1 |
|     3 | Tweet   | Bird    |          1 |
|     4 | Bark    | Dog     |          1 |
|     4 | Bark    | Dog     |          2 |
|     4 | Bark    | Dog     |          3 |
+-------+---------+---------+------------+

PARTITION BY клауза разделя резултатния набор, произведен от FROM клауза в дялове, към които се прилага функцията. Когато посочим дялове за набора от резултати, всеки дял кара номерирането да започне отново (т.е. номерирането ще започне от 1 за първия ред във всеки дял).

Опция 4

За да върнем само излишните редове от съвпадащите дубликати, можем да използваме горната заявка като общ табличен израз, както следва:

WITH cte AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
SELECT * FROM cte WHERE Row_Number <> 1;

Резултат:

+-------+---------+---------+------------+
| PetId | PetName | PetType | Row_Number |
+-------+---------+---------+------------+
|     1 | Wag     | Dog     |          2 |
|     4 | Bark    | Dog     |          2 |
|     4 | Bark    | Dog     |          3 |
+-------+---------+---------+------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как OCT() работи в MariaDB

  2. ИЗПУСКАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА в MariaDB

  3. Какво е новото в MariaDB 10.4

  4. Запознаване с възможностите и функциите на MariaDB SkySQL

  5. Как да преодолеем случайното изтриване на данни в MySQL и MariaDB