Unscharfe Dublettensuche mit SQL

Eindeutige Dubletten sind mit SQL leicht zu finden. Und auch für die Suche nach unscharfen Dubletten implementieren die meisten Datenbankserver einen eigenen SQL-Befehl mit dessen Hilfe sich ähnlich klingende Wörter finden lassen.

Mit dem SOUNDEX-Befehl implementieren die meisten Datenbankserver den wohl am häufigsten verwendeten Algorithmus für die phonetische Suche. SOUNDEX bildet die Buchstaben eines Worts entsprechend ihrem Klang in der englischen Sprache auf eine vier Zeichen lange Zeichenkette ab. Mit diesem einfachen Verfahren lassen sich zum Teil recht gute Ergebnisse erzielen. So wird beispielsweise 'Smith' und 'Smythe' als identisch erkannt. Aber auch in anderen Sprachen als englisch bringt der Algorithmus zum Teil gute Ergebnisse. So werden beispielsweise auch 'Maier', 'Mayer', 'Mayr' und 'Mair' als identisch erkannt.

Allerdings ist das Verfahren auf den Vergleich von einzelnen Worten ausgerichtet, so dass schon der Vergleich von ‚Ken Smith‘ und ‚Smith Ken‘ keinen Treffer mehr liefert. Zum anderen ist dieses Verfahren sprachabhängig. Die Abbildung des zu untersuchenden Worts auf eine vier Zeichen lange Zeichenkette ist zudem ziemlich grob, so dass sich teilweise kuriose Treffer ergeben. Beispielsweise werden 'Hilbert' und 'Heilbronn' oder 'Knuth' und 'Kant' als identisch erkannt.

Hinzu kommt, dass die Abweichung zwischen den beiden zu vergleichenden Worten nicht immer gleich groß sind. Daher wäre es schön wenn bei dem Vergleich ein Übereinstimmungsgrad zurück geliefert werden würde, beispielsweise 80% oder 90%. Phonetische Algorithmen aber liefern als Ergebnis des Vergleichs nur die Angabe zurück ob die beiden Worte ähnlich sind oder nicht.

Eine SQL-Abfrage zum Ermitteln von Dubletten mit Hilfe des SOUNDEX-Befehls könnte beispielsweise so aussehen:

SELECT tab1.id, tab1.name, tab2.id, tab2.name
FROM tablename tab1, tablename tab2
WHERE SOUNDEX(tab1.name)= SOUNDEX(tab2.name)
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE SOUNDEX(tab.name)=SOUNDEX(tab1.name))

Da das Ergebnis dieser Abfrage aber Treffer enthält die mit größter Wahrscheinlichkeit gar keine korrekten Treffer sind und man die Frage welcher Datensatz aus einer Dublettengruppe gelöscht und welcher erhalten bleiben soll wohl nicht dem Zufall überlassen will, kann man das Ergebnis so nicht ohne weiteres weiter verarbeiten. Dazu kommt, dass bei einer derartigen Abfrage immer alle Datensätze mit allen anderen verglichen werden, was die Laufzeit der Abfrage natürlich nach oben treibt.

Der SOUNDEX-Befehl in SQL ist von daher in den allermeisten Fällen kein gangbarer Weg um eine Datenbank von Dubletten zu befreien. Zufriedenstellend gelöst werden aber kann dieses Problem nur von spezialisierten Tools, die eine fehlertolerante Suche nach Dubletten bieten, wie zum Beispiel die DataQualityTools: