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);
前の質問 に提供した回答でその詳細を説明します 。
それがあなたに「最良の」一致をもたらすかどうかについて議論するかもしれません。代替案の1つは、トリグラムインデックスとの類似性の一致です。最後の質問に追加した最初のリンクの詳細。