MSSQL Dubletten suchen
Axel Hoogestraat
- datenbank
0 Frank (no reg)0 fk0 Axel Hoogestraat0 fk
0 Ludger
Hallo,
mich würde mal interessieren, wie Ihr in MSSQL eine Dublettensuche realisieren würdet.
Ich habe in der Dokumentatin bisher nur Soundex() gefunden. Das genügt meinen Ansprüchen leider nicht.
Es soll in einer Kundendatenbank, bei Eingabe eines Kunden geprüft werden, ob dieser schon existiert. Aber natürlich Fehlertolerant.
Soundex hilft ja, wenn z.B. Mirosoft eingibt und Microsoft schon existiert.
Allerdings hilft dieser nicht, wenn jemand Micrsoft GmbH eingibt und bereits eine Name "Microsoft Deutschland GmbH" existiert.
Das Programm soll also auch Teilstrings erkennen. Außnahmen, wie z.B. das der gleiche Teilstring GmbH auch erkannt werden würde, würde ich dann einfach in PHP abfangen.
Aber wie würdet Ihr das SQL-Technisch umsetzen ?
Vielen Dank im Voraus
Schöne Grüße
Axel
Hi,
evt. mit der Volltextindizierung von MS SQL Server 2000 und entsprechenden Abfragen
"Dubletten" ist ein sehr dehnbarer Begriff, du solltest ihn (für dich) eindeutig definieren - was genau alles identifiziert oder eher unterscheidet deine Datensätze voneinander.
Ciao, Frank
Hallo,
evt. mit der Volltextindizierung von MS SQL Server 2000 und entsprechenden Abfragen
Vielen Dank dafür. Wo kann ich denn Infos darüber finden. Ich komme irgendwie mit der MS-Doku total nicht klar. Ich suche schon 2 Tage Infos und stosse auschliesslich auf soundex.
Zur anderen Frage: Ich möchte halt lediglich Schreibfehler erkennen, die sich haupsächlich mit Soundex wohl erkennen lassen sollten (Buchstabendreher, Buchstaben vergessen, falsche Taste gedrückt etc.)
Darüber hinaus eben die erwähnten Teilstrings möglichst kombiniert mit der Fehlertoleranz (WHERE Soundex(variable) LIKE "%Soundex(Kundenname)%" geht leider nicht :-) Und wäre natürlich auch zu ungenau, was das Beispiel "Microsoft GmbH <-> Microsoft Deutschland GmbH" zeigt.
Noch weitere Ideen ?
Nochmals Danke und
schöne Grüße
Axel
mich würde mal interessieren, wie Ihr in MSSQL eine Dublettensuche realisieren würdet.
Ich habe in der Dokumentatin bisher nur Soundex() gefunden. Das genügt meinen Ansprüchen leider nicht.
hier werden nur die vokale rausgeschmissen.
Es soll in einer Kundendatenbank, bei Eingabe eines Kunden geprüft werden, ob dieser schon existiert. Aber natürlich Fehlertolerant.
natürlich
Soundex hilft ja, wenn z.B. Mirosoft eingibt und Microsoft schon existiert.
Allerdings hilft dieser nicht, wenn jemand Micrsoft GmbH eingibt und bereits eine Name "Microsoft Deutschland GmbH" existiert.
Das Programm soll also auch Teilstrings erkennen. Außnahmen, wie z.B. das der gleiche Teilstring GmbH auch erkannt werden würde, würde ich dann einfach in PHP abfangen.Aber wie würdet Ihr das SQL-Technisch umsetzen ?
wie macht das google ??????
microsaft und mircosoft ist jeweils ein wort. m$ gmbh und m$ profitcenter germany sind jeweils mehrere worte.
daher würde ich (neben der volttextindizierung) diese worte in eine liste zerlegen und jedes dieser worte als vergleich heranziehen.
hier gibts dann wahrscheilnlich eine menge treffer, da gmbh ja vielfach vorhanden ist.
daher muß die tabelle mit sich selbst ge-joint werden, um weitere worte in diese abfrage einzubeziehen. dann reduziert sich die ergebnismenge erheblich.
die ergebniszeile mit den größten treffern ist wahrscheinlich der kunde.
Hallo,
daher würde ich (neben der volttextindizierung) diese worte in eine liste zerlegen und jedes dieser worte als vergleich heranziehen.
hier gibts dann wahrscheilnlich eine menge treffer, da gmbh ja vielfach vorhanden ist.
daher muß die tabelle mit sich selbst ge-joint werden, um weitere worte in diese abfrage einzubeziehen. dann reduziert sich die ergebnismenge erheblich.
die ergebniszeile mit den größten treffern ist wahrscheinlich der kunde.
ok... vielen Dank. Das klingt schon sehr logisch. Ähm ich habe nur leider keine Ahnung, wie ich da herangehen muss. Bin noch sehr neu in MSSQL.
Also, was die Volltextindizierung angeht, das muss ich vermutlich im Enterprise Manager einstellen.
Dann den zu suchenden Kunden in Einzelteile zerlegen. ("In eine Liste zerlegen" heisst jetzt in meinem Quellcode, oder gibt es da bestimmte SQL-Listen?)
Wie sieht dann der Vergleich jedes einelnen Teils aus ? Immer mit Soundex dann, ja ?
Und letzlich sagt mir das mit dem "mit sich selbst ge-joint" nichts.
Könntest Du mir das noch etwas klarer machen ?
Vielen, vielen Dank nochmal.
Schöne Grüße
Axel
Also, was die Volltextindizierung angeht, das muss ich vermutlich im Enterprise Manager einstellen.
volltext bedeutet ja nichts weiter, als daß für jedes wort ein eintrag in einem speziellen index angelegt wird.
Dann den zu suchenden Kunden in Einzelteile zerlegen. ("In eine Liste zerlegen" heisst jetzt in meinem Quellcode, oder gibt es da bestimmte SQL-Listen?)
m$ gmbh sind 2 worte. die liste besteht aus 2 worten.
man hat nun 2 möglichkeiten:
entweder eine 2. tabelle neben der kundentabelle, welche die einzelnen worte mit dem kundenindex(kundenid) beinhaltet.
oder man baut den select so auf, daß jedes dieser worte in einer where bedingung erscheint.
Wie sieht dann der Vergleich jedes einelnen Teils aus ? Immer mit Soundex dann, ja ?
diese worte können auch als soundex in where erscheinen.
Und letzlich sagt mir das mit dem "mit sich selbst ge-joint" nichts.
ein self-join verbindet dieselbe tabelle mit sich selbst.
Könntest Du mir das noch etwas klarer machen ?
die worte müssen ja 'UND' verknüpft werden.
bei 2 worten wäre ein join (gibt 2 tabellen mit eigener where) nötig.
bei 3 worten 2 joins usw.
etwa so:
select k1.* from kunden k1 inner join kunden k2 using(kundenid)
where k1.name like %WORT1% and k2.name like %WORT2%
wobei WORT1 und WORT2 die wortliste ist. (m$ und gmbh)
die where bedingung kannst du natürlich auch anders gestalten.
Hi,
Könntest Du mir das noch etwas klarer machen ?
die worte müssen ja 'UND' verknüpft werden.
bei 2 worten wäre ein join (gibt 2 tabellen mit eigener where) nötig.
bei 3 worten 2 joins usw.etwa so:
select k1.* from kunden k1 inner join kunden k2 using(kundenid)
where k1.name like %WORT1% and k2.name like %WORT2%wobei WORT1 und WORT2 die wortliste ist. (m$ und gmbh)
die where bedingung kannst du natürlich auch anders gestalten.
aha. vielen Dank. Das werde ich dann doch nochmal ausprobieren, bevor ich (falls es nicht klappt) mit PHP mache. Es kommt dann nur noch drauf an, ob der Soundex so funktioniert, wie es soll. (Als nicht zu wenig und nicht zu viele Treffer)
Schöne Grüße
Axel
Hi, "fk",
mich würde mal interessieren, wie Ihr in MSSQL eine Dublettensuche realisieren würdet.
Ich habe in der Dokumentatin bisher nur Soundex() gefunden. Das genügt meinen Ansprüchen leider nicht.hier werden nur die vokale rausgeschmissen.
ob der SOUNDEX-Algorhytmus wirklich nur Vokale rauskickt und dann vergleicht? http://www.google.de/search?hl=de&q=soundex+algorythm&meta=
Aber wie würdet Ihr das SQL-Technisch umsetzen ?
Ein Kollege von mir hat zu diesem Zweck ein kleines Rudel Zeichenkettenfunktionen geschrieben. D.h. es duerfte mit den Bordmitteln von T-SQL (DIFFERENCE() faellt mir gerade noch ein) schwer werden.
Gruss,
Ludger
Hallo,
ob der SOUNDEX-Algorhytmus wirklich nur Vokale rauskickt und dann vergleicht? http://www.google.de/search?hl=de&q=soundex+algorythm&meta=
Mir ist gerade aufgefallen, dass es bei PHP (nicht SQL) neben dem soundex auch noch einen Alghorithmus gibt, der "Metaphone" heisst. Der scheint tatsächlich die Vokale rausnehmen. Aber auch nicht ausschliesslich (der hängt dann nch irgendwas dran).
Soundex macht das auf jeden Fall nicht.
Select Soundex('test') ergbit sowas wie 'T260'
Ein Kollege von mir hat zu diesem Zweck ein kleines Rudel Zeichenkettenfunktionen geschrieben. D.h. es duerfte mit den Bordmitteln von T-SQL (DIFFERENCE() faellt mir gerade noch ein) schwer werden.
Den Eindruck bekomme ich auch langsam. Ich denke, ich werde dann auch alle Kunden einlesen und die Dublettenprüfung mit PHP-Funktinonen machen (soundex, metaphone, similar_text und/oder levenshtein).
Auch wenn die Bearbeitung dann sicher länger dauert.
Vielen Dank an Euch
Schöne Grüße
Axel