Duplikate finden in zwei Tabellen

dave_christopher

Aktiver Benutzer
Beiträge
31
Hallo zusammen,

ich möchte Duplikate innerhalb einer Tabelle finden.
Dabei gehe ich bisher so vor:

SELECT Feld1, Feld2, Feld3
FROM (Tabelle1 AS A
JOIN Tabelle1 AS B
ON (
(A.Feld1 = B.Feld1
AND (A.Feld2 = B.Feld2)
)
ORDER BY A.Feld1, B.Feld2

Ein weiteren Vergleichskritierium ist jedoch in einer anderen Tabelle (Tabelle2), welche über eine eindeutige Nummer im Feld 3 mit Tabelle1 verknüpft ist.
In Tabelle2 gibt es das Feld4, dessen Wert auf duplikate geprüft werden soll.
Sprich:
Tabelle 1 ist per Feld 3 mit Tabelle 2 verknüpft.
Ein Datensatz in Tabelle 1 ist dann doppelt, wenn in Tabelle 2 der mit der Feld3-Nummer verknüpfte Wert in Feld4 doppelt oder mehrfach auftaucht.

Gibt es eine Möglichkeit das entsprechend in o.g. Statement zu integrieren?

Vielen Dank für Eure Hilfe!

Viele Grüße
Dave
 
Werbung:
Ich habe Mühe mit deinem bisherigen Join, der würde auch nicht doppelte Datensätze mit sich selbst joinen. Es fehlt ein Kriterium das z.B. der pk aus Tabelle1 Alias A nicht mit dem pk aus Tabelle1 Alias B übereinstimmt.
 
Ich würde das ganze so versuchen:
Code:
SELECT    t1.Feld1,
        t1.Feld2,
        t1.Feld3,
        count(t2.Feld4) - count(DISTINCT t2.Feld4) AS anzahl_dubletten
FROM    Tabelle1 t1
INNER JOIN Tabelle2 t2
ON        t1.Feld3 = t2.Feld3
GROUP BY t1.Feld1,t1.Feld2,t1.Feld3
HAVING count(t2.Feld4) - count(DISTINCT t2.Feld4) > 1
Ich bin aber nicht sicher in welcher Beziehung deine Tabellen zueinander stehen.
 
Entschuldige bitte die späte antwort, leider bin ich erst jetzt wieder dazu gekommen. mich mit dem Problem zu beschäftigen.
Vielen Dank für Deine Rückmeldungen!

Also ein vollständiges Statement sieht bei mir so aus:

SELECT A.IDENTNR AS Quelle, B.IDENTNR AS Ziel,
A.ID, B.ID, A.Name, A.Vorname, A.Institut, A.Institut2, B.Name as Name_Ziel,
B.Vorname as Vorname_Ziel, B.Institut as Institut_Ziel, B.Institut2 as Institut2_Ziel, A.PLZ, A.Ort, A.Strasse, B.PLz as PLZ_Ziel, B.Ort as Ort_Ziel, B.Strasse as Strasse_Ziel
FROM TABELLE1 AS A
JOIN TABELLE1 AS B
ON (
(
(SOUNDEX(A.Name) = SOUNDEX(B.Name) AND SOUNDEX(A.Vorname) = SOUNDEX(B.Vorname))
OR (A.Insitut = B.Insitut AND A.Insitut2 = B.Insitut2)
)
AND (A.Ort = B.Ort)
AND (A.PLZ = B.PLZ)
AND (A.Strasse = B.Strasse)
AND NOT (A.ID = B.ID))
where A.geloescht = 0
AND B.geloescht = 0
ORDER BY A.Name, A.Vorname;

Tabelle 1 hat folgende Struktur (Felder mit ; getrennt)
ID;IDENTNR;Name;Vorname;Institut;Institut2;PLZ;Ort;Strasse
1234;8891441;Mann;Muster;Mustefirma;Musterfirma2;88442;Musterstadt;Musterstraße 5
....

Tabelle2 hat folgende
ID;IDENTNR;Name;Feld4
1234;8891441;Mann;4554544ABC55656
...

Das o.g. Statement funktioniert soweit, nun muss nur noch irgendwie die Tabelle2 eingebunden werden.
Innerhalb Tabell2 soll geprüft werden ob das Feld4 bei unterschiedlichen IDs doppelt vorkommt, fall ja entspricht das dem Kriterium eine Dublette zu sein.
 
Was ich allerdings vergessen habe, ist das "geloescht"-Feld in Tabelle1:

Tabelle 1 hat folgende Struktur (Felder mit ; getrennt)
ID;IDENTNR;Name;Vorname;Institut;Institut2;PLZ;Ort;Strasse;geloescht
1234;8891441;Mann;Muster;Mustefirma;Musterfirma2;88442;Musterstadt;Musterstraße 5;0
....
 
Hat evtl. jemand noch eine Idee wie ich die Tabelle 2 irgendwie in o.g. Statement unterbringen kann?
Ich muss dazu sagen, dass es sich dabei um eine 1:X Tabelle handelt, also ein per ID verknüpfter Datensatz kann in Tabelle2 mehrmals vorkommen.
 
Innerhalb Tabell2 soll geprüft werden ob das Feld4 bei unterschiedlichen IDs doppelt vorkommt, fall ja entspricht das dem Kriterium eine Dublette zu sein.
Also du meinst wenn Eintrag A und Eintrag B aus Tabelle 1 jeweils einen Eintrag in Tabelle 2 mit identischem Feld 4 haben sind A und B Dubletten. (Ungeachtet der anderen Dubletten-Kriterien?)
Oder meinst du Eintrag A ist schon eine Dublette wenn er selbst zwei Einträge in Tabelle 2 mit identischem Feld 4 hat?

Welche Spalte aus Tabelle 2 ist jetzt der Fremdschlüssel der auf Tabelle 1 zeigt?
 
Der Fremdschlüssel ist das Feld "ID".
In Tabelle1 ist die ID einmalig und in Tabelle2 ist die ID X-Fach vorhanden.

Eintrag A und Eintrag B aus Tabelle 1 sind dann eine Dublette, wenn jeweils mindestens ein Eintrag in Tabelle 2 mit identischem Feld 4 existiert und inkl. die anderen Dubletten Kriterien (A.PLZ = B.PLZ etc.) gelten.
 
Wie wäre das hier:
Code:
SELECT    A.IDENTNR AS Quelle,
        B.IDENTNR AS Ziel,
        A.ID,
        B.ID,
        A.Name,
        A.Vorname,
        A.Institut,
        A.Institut2,
        B.Name AS Name_Ziel,
        B.Vorname AS Vorname_Ziel,
        B.Institut AS Institut_Ziel,
        B.Institut2 AS Institut2_Ziel,
        A.PLZ,
        A.Ort,
        A.Strasse,
        B.PLZ AS PLZ_Ziel,
        B.Ort AS Ort_Ziel,
        B.Strasse AS Strasse_Ziel,
        t.Feld4_A,
        t.Feld4_B
FROM    TABELLE1 AS A
JOIN    TABELLE1 AS B
ON    (    SOUNDEX(A.Name) = SOUNDEX(B.Name)
AND        SOUNDEX(A.Vorname) = SOUNDEX(B.Vorname)
OR        A.Insitut = B.Insitut
AND        A.Insitut2 = B.Insitut2 )
AND        A.Ort = B.Ort
AND        A.PLZ = B.PLZ
AND        A.Strasse = B.Strasse
AND NOT    A.ID = B.ID
LEFT JOIN (

SELECT    t1.ID AS ID_A,
        t2.ID AS ID_B,
        t1.Feld4 AS Feld4_A,
        t2.Feld4 AS Feld4_B
FROM    Tabelle2 t1
INNER JOIN Tabelle2 t2
ON        t1.Feld4 = t2.Feld4
AND        t1.ID <> t2.ID

        ) t
ON        t.ID_A = A.ID
AND        t.ID_B = B.ID
WHERE    A.geloescht = 0
AND        B.geloescht = 0
AND        t.ID_A IS NOT NULL
AND        t.ID_B IS NOT NULL
ORDER BY A.Name, A.Vorname;
 
Hallo ukulele,

ich habe soeben dein Statement getestet.
Es funktioniert perfekt! Vielen Dank! :-)

Noch eine Sache:
Die Ausgabe der Dubletten soll so erfolgen:
Quelle;Ziel;...
1234;4321;...
4321;1234;...
9874;4522;...
4522;9874;...

Beim jetzigen Statement treten jedoch auch folgende Fälle bei der Ausgabe auf:
Quelle;Ziel;...
1234;4321;...
4522;9874;...
4321;1234;...
9874;4522;...

Also einmal wird die Quelle als Dublette erkannt und das andere mal ist das ehemalige "Ziel" die Quelle für die Dublette (logisch, da die Erkennung beidseitig funktioniert). Jetzt müsste es nur noch eine Möglichkeit geben, bei der Ausgabe stets die passenden "Quelle, Ziel" und "Ziel, Quelle"-Kombinationen stets unterinander zu haben (wie im Beispiel oben). Wie könnte man das am besten sortieren?

Vielen Dank nochmals!
 
Werbung:
Man könnte übriengs auch LEFT JOIN durch INNER JOIN ersetzen und sich
AND t.ID_A IS NOT NULL
AND t.ID_B IS NOT NULL
sparen, es sollte das selbe Ergebnis sein. Erschwert natürlich das Testen.

Bei der Sortierung müsste man etwas mogeln, wenn du wirlich nuermische IDs hat könnte man das so machen:
Code:
ORDER BY   A.Name,
       A.Vorname,
       ( CASE WHEN A.ID < B.ID THEN A.ID ELSE B.ID END )
 
Zurück
Oben