sql >> Databáze >  >> RDS >> Mysql

4 způsoby, jak najít duplicitní řádky v MySQL

Pokud si myslíte, že tabulka MySQL může mít duplicitní řádky, můžete použít následující možnosti k vrácení všech duplikátů.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT * FROM Pets;

Výsledek:

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

První dva řádky jsou duplikáty, stejně jako poslední tři řádky. Duplicitní řádky sdílejí stejné hodnoty ve všech sloupcích.

Možnost 1

Jednou z možností je použít k vrácení duplicitních řádků následující dotaz:

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

Výsledek:

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

Můžeme rozšířit SELECT seznam, který v případě potřeby obsahuje další sloupce:

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

Výsledek:

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

Můžeme nechat duplikáty zobrazit jako první tak, že je seřadíme podle počtu v sestupném pořadí:

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

Výsledek:

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

Možnost 2

Pokud chceme vypsat pouze duplicitní řádky, můžeme použít HAVING klauzule k vyloučení neduplikátů z výstupu:

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

Výsledek:

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

Možnost 3

Dalším způsobem, jak to udělat, je použít ROW_NUMBER() pomocí funkce PARTITION BY klauzule k očíslování výstupu sady výsledků.

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

Výsledek:

+-------+---------+---------+----+
| PetId | PetName | PetType | rn |
+-------+---------+---------+----+
|     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 klauzule rozděluje sadu výsledků vytvořenou FROM klauzule do oddílů, na které je funkce aplikována. Když určíme oddíly pro sadu výsledků, každý oddíl způsobí, že číslování začne znovu (tj. číslování začne na 1 pro první řádek v každém oddílu).

Možnost 4

Chcete-li vrátit pouze přebytečné řádky z odpovídajících duplikátů, můžeme použít výše uvedený dotaz jako společný tabulkový výraz, jako je tento:

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

Výsledek:

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

  1. SQL Výběr ze dvou tabulek s vnitřním spojením a limitem

  2. Architektura pro bezpečnost:Průvodce pro MySQL

  3. Rozdíl mezi poddotazem a korelovaným poddotazem

  4. Aktualizace předvyplněné databáze