Si vous pensez qu'une table contient des lignes en double dans votre base de données MariaDB, vous pouvez utiliser l'une des requêtes suivantes pour avoir une idée du nombre de lignes en double.
Exemple de données
Supposons que nous ayons un tableau avec les données suivantes :
SELECT * FROM Pets;
Résultat :
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
Les deux premières lignes sont des doublons et les trois dernières lignes sont des doublons.
Option 1
Nous pouvons utiliser la requête suivante pour voir combien de lignes sont des doublons :
SELECT
DISTINCT PetId,
COUNT(*) AS "Count"
FROM Pets
GROUP BY PetId
ORDER BY PetId;
Résultat :
+---------+---------+ | PetId | Count | |---------+---------| | 1 | 2 | | 2 | 1 | | 3 | 1 | | 4 | 3 | +---------+---------+
Nous pouvons développer le SELECT
list pour inclure plus de colonnes si nécessaire :
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY PetId;
Résultat :
+---------+-----------+-----------+---------+ | PetId | PetName | PetType | Count | |---------+-----------+-----------+---------| | 1 | Wag | Dog | 2 | | 2 | Scratch | Cat | 1 | | 3 | Tweet | Bird | 1 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+---------+
Nous pouvons également le trier par nombre dans l'ordre décroissant, de sorte que les lignes avec le plus de doublons apparaissent en premier :
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY Count DESC;
Résultat :
+-------+---------+---------+-------+ | PetId | PetName | PetType | Count | +-------+---------+---------+-------+ | 4 | Bark | Dog | 3 | | 1 | Wag | Dog | 2 | | 3 | Tweet | Bird | 1 | | 2 | Scratch | Cat | 1 | +-------+---------+---------+-------+
Option 2
Si nous voulons que seules les lignes en double soient répertoriées, nous pouvons utiliser le le HAVING
clause pour exclure les lignes non dupliquées :
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
HAVING COUNT(*) > 1
ORDER BY PetId;
Résultat :
+-------+---------+---------+-------+ | PetId | PetName | PetType | Count | +-------+---------+---------+-------+ | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 3 | +-------+---------+---------+-------+
Option 3
Une autre façon de le faire est d'utiliser le ROW_NUMBER()
fonction avec le PARTITION BY
clause pour numéroter la sortie du jeu de résultats.
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets;
Résultat :
+-------+---------+---------+------------+ | 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 | +-------+---------+---------+------------+
La PARTITION BY
la clause divise le jeu de résultats produit par le FROM
clause en partitions auxquelles la fonction est appliquée. Lorsque nous spécifions des partitions pour le jeu de résultats, chaque partition fait recommencer la numérotation (c'est-à-dire que la numérotation commencera à 1 pour la première ligne de chaque partition).
Option 4
Pour renvoyer uniquement les lignes excédentaires des doublons correspondants, nous pouvons utiliser la requête ci-dessus comme expression de table commune, comme ceci :
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;
Résultat :
+-------+---------+---------+------------+ | PetId | PetName | PetType | Row_Number | +-------+---------+---------+------------+ | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +-------+---------+---------+------------+