SQL-Abfrage zum Auffinden von doppelten Zeilen in einer Tabelle
Ich bin auf der Suche nach einen schema-unabhängige Abfrage. Das heißt, wenn ich eine users
Tabelle oder eine purchases
Tabelle, die Abfrage sollte ebenso in der Lage zu fangen doppelten Zeilen in eine Tabelle ohne jegliche änderungen (andere als die from
Klausel, natürlich).
Ich bin mit T-SQL, aber ich vermute, dass es eine Allgemeine Lösung.
TSQL-wie in Sybase oder SQL-Server? Welche version auch
Ein generischer Prozess brauchen würde, um in der Lage zu erkennen und ignorieren Sie den Primärschlüssel Spalte(N) bei der Suche nach Duplikaten?
Sie nennen so etwas ein Duplikat, wenn Sie eines/mehrere Felder haben gleiche Werte für mehrere Zeilen. Sie haben nach der Definition einiger parameter fest liek, ähnlich wie Spaltennamen etc. an.
Fang doppelte Zeilen? Und was tun mit Ihnen? Ausschließen Sie aus den Ergebnissen, nur gehören Sie in die Ergebnisse? Löschen Sie aus den Tabellen? Auch was genau meinst du mit schema-unabhängig?
Es ist ein Duplikat, wenn alle Felder von zwei oder mehr Zeilen die gleichen Werte haben--gibt es keinen primären Schlüssel, und ich werde nicht hinzufügen (ich kann mehr ins detail gehen, wenn du neugierig bist, aber es ist irrelevant für die Lösung). Auch, es ist SQL-Server 2005. @Conrad: Erkennung von Ihnen ist genug, und schema-unabhängig bedeutet, ich will nicht angeben, werden alle Spalten in der Abfrage.
Ein generischer Prozess brauchen würde, um in der Lage zu erkennen und ignorieren Sie den Primärschlüssel Spalte(N) bei der Suche nach Duplikaten?
Sie nennen so etwas ein Duplikat, wenn Sie eines/mehrere Felder haben gleiche Werte für mehrere Zeilen. Sie haben nach der Definition einiger parameter fest liek, ähnlich wie Spaltennamen etc. an.
Fang doppelte Zeilen? Und was tun mit Ihnen? Ausschließen Sie aus den Ergebnissen, nur gehören Sie in die Ergebnisse? Löschen Sie aus den Tabellen? Auch was genau meinst du mit schema-unabhängig?
Es ist ein Duplikat, wenn alle Felder von zwei oder mehr Zeilen die gleichen Werte haben--gibt es keinen primären Schlüssel, und ich werde nicht hinzufügen (ich kann mehr ins detail gehen, wenn du neugierig bist, aber es ist irrelevant für die Lösung). Auch, es ist SQL-Server 2005. @Conrad: Erkennung von Ihnen ist genug, und schema-unabhängig bedeutet, ich will nicht angeben, werden alle Spalten in der Abfrage.
InformationsquelleAutor Richard Pianka | 2011-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass dies sollte für Sie arbeiten. Beachten Sie, dass die PRÜFSUMME() ist nicht 100% perfekt - es ist theoretisch möglich, eine falsch-positiv-hier (glaube ich), aber ansonsten kann man nur ändern Sie den Namen der Tabelle und sollte dies funktionieren:
Den
ROW_NUMBER()
benötigt wird, so dass Sie die Möglichkeit haben, die Unterscheidung Zeilen. Es erfordert eineORDER BY
- und das kann nicht konstant sein, soGETDATE()
war mein workaround für die, die.Ändern Sie einfach den Namen der Tabelle in der CTE und es sollte funktionieren ohne die Rechtschreibung aus den Spalten.
Ja, ich habe eine neue Tabelle Hinzugefügt, ein paar doppelte Zeilen zusammen mit anderen nicht-Duplikate sowie einige mit NULL-Werten, und es zurückgegeben, was ich erwartet hatte. Ich habe gerade getestet mit ein copy-paste von meiner Antwort und es funktionierte wieder wie erwartet.
Das problem war auf mein Ende. Vielen Dank für die Hilfe!
+1 sehr schön und sehr performant. Es ist zwar durchaus möglich, für die PRÜFSUMME, um wieder den gleichen Wert, da es ein Hash. z.B.
SELECT CHECKSUM('A')
undSELECT CHECKSUM(142)
sind die gleichen. Aber es wird weniger wahrscheinlich mit dem EinsatzSELECT CHECKSUM(*)
aber es kann immer noch passieren. In diesem Fall sehr nützlich, wenn Sie verwenden möchten, auf die gleiche Weise, eine Bloom-Filter verwendet wirdPerformant? Einfach tun, row_number() over (partition by-Prüfsumme order by (select null)) in eine abgeleitete Tabelle würde etwa eine million mal schneller.
InformationsquelleAutor Tom H
Ich bin immer noch verwirrt über das, was "Sie zu erkennen sein könnte," aber ich werde give it a shot.
Ohne Sie ist einfach
z.B.
Allerdings, wenn Sie wollen, dass nur Sie und ein Duplikat aller Felder, die als Sie zu tun haben
Können Sie nicht Weg mit nur die mit (*) da kann man nicht
GROUP BY *
also diese Forderung aus Ihren Kommentaren ist schwierig
Es sei denn, Sie möchten verwenden dynamisches SQL und Lesen Sie die Spalten von
sys.columns
oderinformation_schema.columns
Beispielsweise
Bitte beachten Sie sollte das Lesen Der Fluch und Segen von Dynamischem SQL, wenn Sie nicht schon
InformationsquelleAutor Conrad Frix
Habe ich dies getan, die Allgemeine Tabellenausdrücke verwenden, die in SQL Server.
Hier ist ein Beispiel, wie löschen der Duplikate, aber Sie sollten in der Lage sein, um eine Anpassung leicht zu finden dupes:
Hier ist ein link zu einem Artikel wo ich die SQL:
http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/
InformationsquelleAutor JohnD
Ich war kürzlich auf der Suche in das gleiche Problem und festgestellt diese Frage.
Ich konnte es lösen mit Hilfe einer gespeicherten Prozedur mit einigen dynamischen SQL. Auf diese Weise müssen Sie nur angeben, der name der Tabelle. Und es bekommen alle anderen relevanten Daten aus der sys-Tabellen.
InformationsquelleAutor ppijnenburg