Ricerca fuzzy di duplicati con SQL

Con SQL è facile trovare i duplicati univoci, e anche per la ricerca di duplicati fuzzy la maggior parte dei server database implementa un proprio comando SQL che consente di trovare parole dal suono simile.

Moltissimi server database implementano l'algoritmo più frequentemente utilizzato per la ricerca fonetica con il comando SOUNDEX. SOUNDEX mappa in una stringa di quattro caratteri le lettere di una parola secondo il suo suono in lingua inglese. È una semplice procedura con la quale si possono conseguire risultati in parte anche molto buoni ('Smith' e 'Smythe' ad esempio vengono riconosciuti come identici). Anche in altre lingue diverse dall'inglese l'algoritmo porta a risultati tutto sommato buoni, e per esempio 'Maier', 'Mayer', 'Mayr' e 'Mair' sono considerati uguali.

Poiché tuttavia la procedura è comunque orientata al confronto di singole parole, da 'Ken Smith' e 'Smith Ken', ad esempio, non sorgono occorrenze. Questa procedura, poi, dipende dalla lingua. Il mappaggio della parola da esaminare in una stringa di quattro caratteri inoltre è piuttosto approssimativo, da cui conseguono occorrenze talvolta singolari, così per esempio 'Hilbert' e 'Heilbronn‘ o 'Knuth' e 'Kant‘ sono considerate parole identiche.

Inoltre, la differenza tra le due parole da confrontare non è sempre la stessa. Pertanto, sarebbe opportuno che il confronto restituisse un grado di accordo, ad esempio 80% o 90%. Gli algoritmi fonetici, tuttavia, restituiscono solo il risultato del confronto, che le due parole siano simili o meno.

Una query SQL per la determinazione di duplicati mediante un comando SOUNDEX potrebbe essere così:

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))

Il risultato di questa query contiene occorrenze che con grande probabilità non sono affatto corrette (e tuttavia non si vuole lasciare al caso la scelta del record di dati da cancellare da un gruppo di duplicati e del record di dati da mantenere) e non può pertanto essere elaborato. Con una query di questo tipo perciò tutti i record di dati vengono sempre confrontati con tutti gli altri, il che comporta un notevole aumento del tempo di esecuzione della query.

Ne consegue che il comando SOUNDEX in SQL nella maggior parte dei casi non è una modalità viabile per liberare un database da duplicati. Questo problema può essere risolto in maniera soddisfacente solo con speciali strumenti che offrono una ricerca dei duplicati a tolleranza d'errore, come DataQualityTools: