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
bijgewerkt na update van de vraag.) Zonder ORDER BY
het kiest een willekeurige match.
Uitleg voor de techniek in dit gerelateerde antwoord:
Selecteer de eerste rij in elke GROUP BY-groep?
Een functionele index in je woordenboek zou dit snel maken :
CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);
Meer uitleg daarvoor in het antwoord dat ik heb gegeven op de voorafgaande vraag .
Je kunt er over discussiëren of je daarmee de "beste" match krijgt. Een alternatief zou een overeenkomst zijn met een trigram-index. Details in de eerste van de links die ik aan uw laatste vraag heb toegevoegd.