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
aktualizováno po aktualizaci otázky.) Bez ORDER BY
vybírá libovolnou shodu.
Vysvětlení techniky v této související odpovědi:
Vybrat první řádek v každé skupině GROUP BY?
Funkční index ve vašem slovníku by to urychlil :
CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);
Další vysvětlení v odpovědi, kterou jsem poskytl na předběžnou otázku .
Dalo by se diskutovat o tom, zda to pro vás bude "nejlepší" zápas. Jednou z alternativ by byla podobnostní shoda s trigramovým indexem. Podrobnosti v prvním z odkazů, které jsem přidal k vaší poslední otázce.