Ich habe eine Tabelle mit einer varchar-Spalte und möchte alle Datensätze finden, die doppelte Werte in dieser Spalte haben. Was ist die beste Abfrage, die ich verwenden kann, um die Duplikate zu finden?
Antworten
Zu viele Anzeigen?Machen Sie eine SELECT
mit einer GROUP BY
Klausel. Sagen wir Name ist die Spalte, in der Sie nach Duplikaten suchen wollen:
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
Dies liefert ein Ergebnis mit dem Name Wert in der ersten Spalte und eine Zählung, wie oft dieser Wert in der zweiten Spalte erscheint.
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
Diese Abfrage gibt vollständige Datensätze zurück, nicht nur eindeutige varchar_column
's.
Diese Abfrage verwendet nicht COUNT(*)
. Wenn es viele Duplikate gibt, COUNT(*)
ist teuer, und Sie brauchen nicht die ganze COUNT(*)
Sie müssen nur wissen, ob es zwei Zeilen mit demselben Wert gibt.
Dies wird erreicht durch die LIMIT 1, 1
am Ende der korrelierten Abfrage (was im Wesentlichen bedeutet: "Gib die zweite Zeile zurück"). EXISTS würde nur dann true zurückgeben, wenn die besagte zweite Zeile existiert (d. h. es gibt mindestens zwei Zeilen mit demselben Wert der varchar_column).
Mit einem Index auf varchar_column
wird diese Abfrage natürlich erheblich beschleunigen.
Um alle Daten zu erhalten, die Duplikate enthalten, habe ich dies verwendet:
SELECT * FROM TableName INNER JOIN(
SELECT DupliactedData FROM TableName GROUP BY DupliactedData HAVING COUNT(DupliactedData) > 1 order by DupliactedData)
temp ON TableName.DupliactedData = temp.DupliactedData;
Tabellenname = die Tabelle, mit der Sie arbeiten.
DupliactedData = die doppelten Daten, nach denen Sie suchen.
- See previous answers
- Weitere Antworten anzeigen