PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Joindre deux tables dans une requête complexe (données non uniformes)

SELECT DISTINCT ON (1)
       t.id, d.address, d.id
FROM   data_table t
JOIN   dictionary d ON replace(d.address, ' ', '')
                 LIKE (replace(t.address, ' ', '') || '%')
ORDER  BY t.id, d.address, d.id

(ORDER BY mis à jour après la mise à jour de la question.) Sans ORDER BY il choisit une correspondance arbitraire.
Explication de la technique dans cette réponse connexe :
Sélectionner la première ligne de chaque groupe GROUP BY ?

Un index fonctionnel sur votre dictionnaire rendrait cela rapide :

CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);

Plus d'explications à ce sujet dans la réponse que j'ai fournie à la question préliminaire .

On pourrait débattre si cela vous donne le "meilleur" match. Une alternative serait une correspondance de similarité avec un index de trigramme. Détails dans le premier des liens que j'ai ajoutés à votre dernière question.