doppelte einträge finden
reimer
- datenbank
0 Frank Jonas0 reimer0 Frank Jonas0 reimer
0 Ole0 Klaus Mock
Wie finde ich mit Standard-SQL (incl subqueries) *nur* die Datensätze in einer Tabelle die mindestens doppelt vorkommen (bzw. sogar mehrfach)? Das sollte doch eigentlich möglich sein, ich sehe aber einfach nicht wie.
Gruss
Reimer
Hallo,
SELECT MAX(eintrag), COUNT(eintrag) FROM tabelle GROUP BY eintrag
Gruß Frank
SELECT MAX(eintrag), COUNT(eintrag) FROM tabelle GROUP BY eintrag
Prima Lösung. Da muss ich mal verstärkt max,count und group nachlesen und verstehen.
Kann ich das ganze auch auf den (für mich) nichttrivialFall zweier Tabellen anwenden?
tab1
id01 nr01
tab2
id01 tx01
Die "Tabelle" der nr01-Doppelwerte entsteht aus:
in Worten:
Suche unique nr01/tx01-Tupel
SQL:
select *distinct* t.nr01, tt.tx01 from tab1 t, tab2 tt where t.id01=tt.id01
Vielen Dank
Reimer
Hallo Reimer
Suche unique nr01/tx01-Tupel
??? Kannst Du mir das so erklären, daß ich das auch verstehe. Sorry, geht auf's Wochenende zu.
Gruß Frank
Hallo Reimer
Suche unique nr01/tx01-Tupel
??? Kannst Du mir das so erklären, daß ich das auch verstehe.
Hast ja recht, íst so nicht zu verstehen. Vielleicht wird es so deutlicher:
tab1 <= tabellenname
id01 nr01 <=tabellenspaltennamen
a 01 <= spalteninhalte
b 01
c 02
d 05
e 02
tab2
id01 tx01
a tx01
b tx02
c tx02
d tx05
e tx02
Es geht darum die durch einen Equijoin über id01 entstehenden Paarungen nr01/tx01 auf Doppel in nr01 abzuprüfen.
select *distinct* t.nr01, tt.tx01 from tab1 t, tab2 tt where t.id01=tt.id01
=>
01 tx01
01 tx02
02 tx02
05 tx05
=> "01" ist doppelt belegt. Diese "Doppel" möchte ich aus ca 1000recs tiefen Tabellen herausfiltern
Vielen Dank für deine Geduld und ein schönes Wochenende
Reimer
hi Reimer
vileicht etwas in der richtung?
select name,vorname from adressen where ID in
(
select O.ID from adressen O inner join adressen I on I.name=O.name and I.vorname=O.vorname and I.ID < O.ID
)
könnte funktionieren ;)
so long
ole
(8-)>
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