Pokud máte tabulku, u které máte podezření, že má duplicitní řádky ve vaší databázi MariaDB, můžete použít kterýkoli z následujících dotazů, abyste získali představu o tom, kolik řádků je duplicitních.
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 a poslední tři řádky jsou duplikáty.
Možnost 1
Můžeme použít následující dotaz, abychom viděli, kolik řádků je duplicitních:
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 | +---------+-----------+-----------+---------+
Alternativně jej můžeme seřadit podle počtu v sestupném pořadí, takže řádky s největším počtem duplikátů se zobrazí jako první:
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 | | 3 | Tweet | Bird | 1 | | 2 | Scratch | Cat | 1 | +-------+---------+---------+-------+
Možnost 2
Pokud chceme, aby byly uvedeny pouze duplicitní řádky, můžeme použít HAVING
klauzule k vyloučení neduplicitních řádků:
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 Row_Number
FROM Pets;
Výsledek:
+-------+---------+---------+------------+ | 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
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 Row_Number
FROM Pets
)
SELECT * FROM cte WHERE Row_Number <> 1;
Výsledek:
+-------+---------+---------+------------+ | PetId | PetName | PetType | Row_Number | +-------+---------+---------+------------+ | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +-------+---------+---------+------------+