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
aktualizacja po aktualizacji pytania). Bez ORDER BY
wybiera dowolne dopasowanie.
Wyjaśnienie techniki w tej powiązanej odpowiedzi:
Wybrać pierwszy wiersz w każdej grupie GROUP BY?
Funkcjonalny indeks w Twoim słowniku uczyniłby to szybko :
CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);
Więcej wyjaśnień w odpowiedzi, której udzieliłem na pytanie wstępne .
Można by dyskutować, czy dzięki temu uzyskasz „najlepsze” dopasowanie. Jedną z alternatyw byłoby dopasowanie podobieństwa z indeksem trygramu. Szczegóły w pierwszym z linków, które dodałem do Twojego ostatniego pytania.