Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Duplikate finden in zwei Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von dave_christopher, 14 September 2015.

  1. dave_christopher

    dave_christopher Aktiver Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     
  4. Distrilec

    Distrilec Datenbank-Guru

    Wie wäre es mit DDLs der beiden Tabellen und ein paar Testdaten, die möglichst alle Datenkonstellationen abfangen?
     
  5. dave_christopher

    dave_christopher Aktiver Benutzer

    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.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Im select hat Tabelle2 z.B. PLZ, in der Strukurbeschreibung dann nicht mehr ...
     
  7. dave_christopher

    dave_christopher Aktiver Benutzer

    Tabelle2 hat kein Feld PLZ. In der Strukturbeschreibung von Tabelle1 kommt es jedoch vor.
     
  8. Distrilec

    Distrilec Datenbank-Guru

    Self-Join :rolleyes: Der Teil mit Tabelle2 fehlt ihm ja noch :)
     
  9. dave_christopher

    dave_christopher Aktiver Benutzer

    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
    ....
     
  10. dave_christopher

    dave_christopher Aktiver Benutzer

    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.
     
  11. ukulele

    ukulele Datenbank-Guru

    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?
     
  12. dave_christopher

    dave_christopher Aktiver Benutzer

    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.
     
  13. ukulele

    ukulele Datenbank-Guru

    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;
     
  14. dave_christopher

    dave_christopher Aktiver Benutzer

    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!
     
  15. ukulele

    ukulele Datenbank-Guru

    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 )
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden