Hallo,
Wie finde ich mit Standard-SQL (incl subqueries) *nur* die Datensätze in einer Tabelle die mindestens doppelt vorkommen (bzw. sogar mehrfach)?
Zuerst solltest Du Dir im klaren sein, _wie_ der begriff 'doppelte Datensätze' definiert ist. Ist er nur dann doppelt, wenn alle Felder (außer das, hoffentlich vorhandene, ID-Feld) identisch befüllt sind, oder nur einige dieser Felder, oder ist es auch ein doppelter Datensatz, wenn bei zwei Datensätzen ein oder mehrere Felder fast gleich bzw ähnlich sind (Ich denke da an Gorß-Kleinschreibung und z.B. eine Telefon-Nummer, die einmal '+498154711' und ein anderes mal '0049 815 4711' geschrieben ist).
Erst wenn diese Vorgaben genau definiert sind, kannst Du Dich wirklich auf die Suche begeben. Dafür, glaube ich, sind ein 'Group by' in Verbindung mit der Funktion Count() die passenden Werkzeuge. Du Gruppierst nach jenen Feldern, welche für Dich bestimmen, was nun ein doppelter Eintrag ist, und was nicht. Dabei können eventuell auch zuätzliche Funktionen notwendig sein, welche aber dann nicht zwangsläufig in Standard-SQL verfügbar sind. Dabei filterst Du all diese Datensätze aus, bei denen Count() eins ergibt, also jene die nur einmal vorkommen.
Damit Du diese Ergebnisse auch verwenden kannst um alle relevanten Datensätze eindeutig zu identifizieren, wäre es sinnvoll, diese Einträge eventuell durch ein einfaches aneinanderfügen der Werte zu einem einzigen String eindeutig zu machen, womit Du dann die ID-Werte abfragen kannst.
Beispiel:
SELECT id FROM tabelle
WHERE name||vorname IN
( SELECT name||vorname FROM tabelle
GROUP BY name,vorname
HAVING count(*) >1)
Das ist zwar eine Variante, so etwas mit einem Statement abzudecken, allerdings wird es ziemich unperformant sein. Besser wäre IMHO so etwas über ein Programm abzudecken, daß diese Arbeit mit zwei Statements erledigt.
Noch besser wäre es, diese Prüfung bereits vor dem Einfügen zu machen (z.B. mit Constraints) um doppelte Einträge gleich gar nicht in die Datenbank zu schreiben.
Grüße
Klaus