Wenn Sie eine Tabelle haben, von der Sie vermuten, dass sie doppelte Zeilen in Ihrer MariaDB-Datenbank enthält, können Sie eine der folgenden Abfragen verwenden, um eine Vorstellung davon zu bekommen, wie viele Zeilen Duplikate sind.
Beispieldaten
Angenommen, wir haben eine Tabelle mit den folgenden Daten:
SELECT * FROM Pets;
Ergebnis:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
Die ersten beiden Zeilen sind Duplikate und die letzten drei Zeilen sind Duplikate.
Möglichkeit 1
Wir können die folgende Abfrage verwenden, um zu sehen, wie viele Zeilen Duplikate sind:
SELECT
DISTINCT PetId,
COUNT(*) AS "Count"
FROM Pets
GROUP BY PetId
ORDER BY PetId;
Ergebnis:
+---------+---------+ | PetId | Count | |---------+---------| | 1 | 2 | | 2 | 1 | | 3 | 1 | | 4 | 3 | +---------+---------+
Wir können SELECT
erweitern Liste, um bei Bedarf weitere Spalten aufzunehmen:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY PetId;
Ergebnis:
+---------+-----------+-----------+---------+ | PetId | PetName | PetType | Count | |---------+-----------+-----------+---------| | 1 | Wag | Dog | 2 | | 2 | Scratch | Cat | 1 | | 3 | Tweet | Bird | 1 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+---------+
Wir können es alternativ nach Anzahl in absteigender Reihenfolge sortieren, sodass die Zeilen mit den meisten Duplikaten zuerst erscheinen:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY Count DESC;
Ergebnis:
+-------+---------+---------+-------+ | PetId | PetName | PetType | Count | +-------+---------+---------+-------+ | 4 | Bark | Dog | 3 | | 1 | Wag | Dog | 2 | | 3 | Tweet | Bird | 1 | | 2 | Scratch | Cat | 1 | +-------+---------+---------+-------+
Option 2
Wenn nur die doppelten Zeilen aufgelistet werden sollen, können wir das den HAVING
verwenden -Klausel zum Ausschließen nicht doppelter Zeilen:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
HAVING COUNT(*) > 1
ORDER BY PetId;
Ergebnis:
+-------+---------+---------+-------+ | PetId | PetName | PetType | Count | +-------+---------+---------+-------+ | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 3 | +-------+---------+---------+-------+
Möglichkeit 3
Eine andere Möglichkeit ist die Verwendung von ROW_NUMBER()
Funktion mit dem PARTITION BY
-Klausel, um die Ausgabe der Ergebnismenge zu nummerieren.
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets;
Ergebnis:
+-------+---------+---------+------------+ | 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 | +-------+---------+---------+------------+
Die PARTITION BY
-Klausel teilt die von FROM
erzeugte Ergebnismenge -Klausel in Partitionen, auf die die Funktion angewendet wird. Wenn wir Partitionen für die Ergebnismenge angeben, bewirkt jede Partition, dass die Nummerierung erneut beginnt (d. h. die Nummerierung beginnt bei 1 für die erste Zeile in jeder Partition).
Option 4
Um nur die überschüssigen Zeilen aus den übereinstimmenden Duplikaten zurückzugeben, können wir die obige Abfrage wie folgt als allgemeinen Tabellenausdruck verwenden:
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;
Ergebnis:
+-------+---------+---------+------------+ | PetId | PetName | PetType | Row_Number | +-------+---------+---------+------------+ | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +-------+---------+---------+------------+