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
актуализиран след актуализиране на въпроса.) Без ORDER BY
той избира произволно съвпадение.
Обяснение за техниката в този свързан отговор:
Избиране на първия ред във всяка група GROUP BY?
Функционален индекс на вашия речник ще направи това бързо :
CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);
Повече обяснение за това в отговора, който предоставих на предизвестен въпрос .
Може да се спори дали това ще ви донесе „най-доброто“ съвпадение. Една алтернатива би била съвпадение по сходство с индекс на триграма. Подробности в първата от връзките, които добавих към последния ви въпрос.