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?Ein sehr später Beitrag... falls er jemandem gaaaaanz weit unten hilft... Ich hatte die Aufgabe, übereinstimmende Transaktionspaare (eigentlich beide Seiten von Konto-zu-Konto-Überweisungen) in einer Banking-App zu finden, um herauszufinden, welche die "von"- und die "nach"-Transaktion für jede Inter-Account-Transfer-Transaktion waren, und so kamen wir zu diesem Ergebnis:
SELECT
LEAST(primaryid, secondaryid) AS transactionid1,
GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
SELECT table1.transactionid AS primaryid,
table2.transactionid AS secondaryid
FROM financial_transactions table1
INNER JOIN financial_transactions table2
ON table1.accountid = table2.accountid
AND table1.transactionid <> table2.transactionid
AND table1.transactiondate = table2.transactiondate
AND table1.sourceref = table2.destinationref
AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;
Das Ergebnis ist, dass die DuplicateResultsTable
liefert Zeilen mit übereinstimmenden (d.h. doppelten) Transaktionen, aber es liefert auch dieselben Transaktions-IDs in umgekehrter Reihenfolge, wenn es das gleiche Paar zum zweiten Mal findet, so dass die äußere SELECT
ist dazu da, nach der ersten Transaktions-ID zu gruppieren, was durch die Verwendung von LEAST
y GREATEST
um sicherzustellen, dass die beiden Transaktions-IDs in den Ergebnissen immer in der gleichen Reihenfolge stehen, so dass es sicher ist, dass GROUP
durch die erste, wodurch alle doppelten Treffer eliminiert werden. Ich habe fast eine Million Datensätze durchsucht und mehr als 12.000 Übereinstimmungen in weniger als 2 Sekunden gefunden. Natürlich ist die transactionid der primäre Index, was sehr hilfreich war.
Um doppelte Zeilen mit mehreren Feldern zu entfernen, stornieren Sie sie zunächst mit dem neuen eindeutigen Schlüssel, der für die einzigen eindeutigen Zeilen angegeben ist, und verwenden Sie dann den Befehl "Gruppieren nach", um doppelte Zeilen mit demselben neuen eindeutigen Schlüssel zu entfernen:
Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;