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

"Ähnliche" Duplikate

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von PeterP4LE, 23 Januar 2015.

  1. PeterP4LE

    PeterP4LE Benutzer

    Guten Tag,

    ich habe folgendes Problem:

    Ich hab historisch bedingt eine Tabelle, die Adressdaten enthält.

    Der Aufbau der Tabelle ist dabei (gekürzt):

    Name | Vorname | Firma | Strasse
    Mustermann | Max | Eugen Müller GmbH | Mustergasse
    Tester | Toni | Moritz Maier KG | Teststrasse 1
    Versuch | Volker | Müller Eugen GmbH | Mustergasse 1
    Try | Theo | Ernst Maier GmbH | Veruschsweg 2

    Was ich brauche ist ein Select der mir einen Teil des Spalte Firma nimmt und Duplikate ausgibt:

    Das Ergebnis wäre dann in meinem kleinen Beispiel:
    Mustermann | Max | Eugen Müller GmbH | Mustergasse
    Versuch | Volker | Müller Eugen GmbH | Mustergasse 1


    Mustermann | Max | Eugen Müller GmbH | Mustergasse
    Versuch | Volker | Müller Eugen GmbH | Mustergasse 1

    Tester | Toni | Moritz Maier KG | Teststrasse 1
    Try | Theo | Ernst Maier GmbH | Veruschsweg 2

    Tester | Toni | Moritz Maier KG | Teststrasse 1
    Try | Theo | Ernst Maier GmbH | Veruschsweg 2


    Hat dazu jeman eine Idee?

    Vielen Dank im Vorfeld.

    LG

    Peter
     
  2. ukulele

    ukulele Datenbank-Guru

    Manuell kriegt man so eine Suche problemlos hin aber eine automatische Suche oder gar Erkennung von Dubletten ist nicht so einfach.

    Ein Ansatz wäre alle Firmen zu zerlegen und die einzelnen Worte als n:m-Beziehung abzubilden um sie dann nach Übereinstimmungen zu gliedern. Sonderzeichen und Schreibweisen sind natürlich auch nicht ohne.

    Ich hab sowas gebastelt und versuche das mal in vereinfachter Form weiter zu geben:
    Code:
    DECLARE    @pk UNIQUEIDENTIFIER,
            @bezeichnung VARCHAR(255),
            @counter INT
    
    SET        @counter = (    SELECT    count(*)
                            FROM    unternehmen )
    WHILE    @counter > 0
    BEGIN
        SET        @pk = (    SELECT    pk
                        FROM (    SELECT    TOP (@counter) pk,
                                        ROW_NUMBER() OVER (ORDER BY pk) AS zeilennr
                                FROM    unternehmen
                                ORDER BY pk ) x
                        WHERE    x.zeilennr = @counter )
    
        SET        @bezeichnung = (    SELECT    bezeichnung
                                    FROM    unternehmen
                                    WHERE    pk = @pk )
    
        -- Phase 1.1: Zeichen durch Zeichen ersetzen
        SET        @bezeichnung = lower(@bezeichnung)
        SET        @bezeichnung = replace(@bezeichnung,'','')
        SET        @bezeichnung = replace(@bezeichnung,'²','2')
        SET        @bezeichnung = replace(@bezeichnung,'³','3')
        SET        @bezeichnung = replace(@bezeichnung,'ß','ss')
        SET        @bezeichnung = replace(@bezeichnung,'@','at')
        SET        @bezeichnung = replace(@bezeichnung,'€','e')
        SET        @bezeichnung = replace(@bezeichnung,'ä','ae')
        SET        @bezeichnung = replace(@bezeichnung,'ö','oe')
        SET        @bezeichnung = replace(@bezeichnung,'ü','ue')
        SET        @bezeichnung = replace(@bezeichnung,'á','a')
        SET        @bezeichnung = replace(@bezeichnung,'é','e')
        SET        @bezeichnung = replace(@bezeichnung,'í','i')
        SET        @bezeichnung = replace(@bezeichnung,'ó','o')
        SET        @bezeichnung = replace(@bezeichnung,'ú','u')
        SET        @bezeichnung = replace(@bezeichnung,'à','a')
        SET        @bezeichnung = replace(@bezeichnung,'è','e')
        SET        @bezeichnung = replace(@bezeichnung,'ì','i')
        SET        @bezeichnung = replace(@bezeichnung,'ò','o')
        SET        @bezeichnung = replace(@bezeichnung,'ù','u')
        SET        @bezeichnung = replace(@bezeichnung,'â','a')
        SET        @bezeichnung = replace(@bezeichnung,'ê','e')
        SET        @bezeichnung = replace(@bezeichnung,'î','i')
        SET        @bezeichnung = replace(@bezeichnung,'ô','o')
        SET        @bezeichnung = replace(@bezeichnung,'û','u')
        -- Phase 1.2: Zeichen durch Leerzeichen ersetzen
        SET        @bezeichnung = replace(@bezeichnung,'°',' ')
        SET        @bezeichnung = replace(@bezeichnung,'^',' ')
        SET        @bezeichnung = replace(@bezeichnung,'!',' ')
        SET        @bezeichnung = replace(@bezeichnung,'"',' ')
        SET        @bezeichnung = replace(@bezeichnung,'§',' ')
        SET        @bezeichnung = replace(@bezeichnung,'$',' ')
        SET        @bezeichnung = replace(@bezeichnung,'[%]',' ')
        SET        @bezeichnung = replace(@bezeichnung,'/',' ')
        SET        @bezeichnung = replace(@bezeichnung,'=',' ')
        SET        @bezeichnung = replace(@bezeichnung,'\',' ')
        SET        @bezeichnung = replace(@bezeichnung,'#',' ')
        SET        @bezeichnung = replace(@bezeichnung,'.',' ')
        SET        @bezeichnung = replace(@bezeichnung,'[_]',' ')
        SET        @bezeichnung = replace(@bezeichnung,'&',' ')
        SET        @bezeichnung = replace(@bezeichnung,'+',' ')
        SET        @bezeichnung = replace(@bezeichnung,'-',' ')
        -- Phase 1.3: Zeichen tilgen
        SET        @bezeichnung = replace(@bezeichnung,'{','')
        SET        @bezeichnung = replace(@bezeichnung,'(','')
        SET        @bezeichnung = replace(@bezeichnung,'[','')
        SET        @bezeichnung = replace(@bezeichnung,']','')
        SET        @bezeichnung = replace(@bezeichnung,')','')
        SET        @bezeichnung = replace(@bezeichnung,'}','')
        SET        @bezeichnung = replace(@bezeichnung,'?','')
        SET        @bezeichnung = replace(@bezeichnung,'´','')
        SET        @bezeichnung = replace(@bezeichnung,'`','')
        SET        @bezeichnung = replace(@bezeichnung,'*','')
        SET        @bezeichnung = replace(@bezeichnung,'~','')
        SET        @bezeichnung = replace(@bezeichnung,'''','')
        SET        @bezeichnung = replace(@bezeichnung,'>','')
        SET        @bezeichnung = replace(@bezeichnung,'<','')
        SET        @bezeichnung = replace(@bezeichnung,'|','')
        SET        @bezeichnung = replace(@bezeichnung,';','')
        SET        @bezeichnung = replace(@bezeichnung,',','')
        SET        @bezeichnung = replace(@bezeichnung,':','')
        SET        @bezeichnung = replace(@bezeichnung,'·','')
        -- Phase 1.4: Wörter durch Wörter ersetzen
        SET        @bezeichnung = replace(@bezeichnung,' and ',' und ')
        SET        @bezeichnung = replace(@bezeichnung,'mbh co kg','mbhcokg')
        SET        @bezeichnung = replace(@bezeichnung,'gesellschaft',' gesellschaft')
        SET        @bezeichnung = replace(@bezeichnung,'genossenschaft',' genossenschaft')
        -- Phase 1.3: Zeichen tilgen
        WHILE    @bezeichnung LIKE '%  %'
        BEGIN
            SET        @bezeichnung = replace(@bezeichnung,'  ',' ')
        END
    
        -- Phase 2: Wörterliste befüllen
        SET        @bezeichnung = rtrim(ltrim(@bezeichnung))
    
        WHILE    len(@bezeichnung) >= 4
        BEGIN
            IF        @bezeichnung LIKE '% %'
            BEGIN
                IF        len(left(@bezeichnung,charindex(' ',@bezeichnung)-1)) >= 4
                BEGIN
                    INSERT INTO unternehmen_woerter(fk_unt,string)
                    VALUES(@pk,left(@bezeichnung,charindex(' ',@bezeichnung)-1))
                END
    
                SET        @bezeichnung = right(@bezeichnung,len(@bezeichnung)-charindex(' ',@bezeichnung))
            END
            ELSE
            BEGIN
                IF        len(@bezeichnung) >= 4
                BEGIN
                    INSERT INTO unternehmen_woerter(fk_unt,string)
                    VALUES(@pk,@bezeichnung)
                END
               
                SET        @bezeichnung = ''
            END
        END
    
        SET        @counter = @counter - 1
    END
    Das filtert erstmal jede Menge Zeugs und trennt dann die Wörter auf. Darauf kannst du dann Abfragen machen.
     
    Walter gefällt das.
  3. PeterP4LE

    PeterP4LE Benutzer

    Guten Tag,

    tausend Dank!!!
    Das ist genau was ich gesucht habe.

    LG

    Peter
     
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