PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbinden zweier Tabellen in einer komplexen Abfrage (keine einheitlichen Daten)

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 aktualisiert nach Fragenaktualisierung.) Ohne ORDER BY es wird eine beliebige Übereinstimmung ausgewählt.
Erklärung für die Technik in dieser verwandten Antwort:
Erste Zeile in jeder GROUP BY-Gruppe auswählen?

Ein funktionaler Index für Ihr Wörterbuch würde dies schnell machen :

CREATE INDEX dictionary_address_text_pattern_ops_idx
ON dictionary (replace(address, ' ', '') text_pattern_ops);

Weitere Erklärungen dazu finden Sie in der Antwort, die ich auf die Vorfrage gegeben habe .

Man könnte darüber streiten, ob Sie damit die "beste" Übereinstimmung erhalten. Eine Alternative wäre ein Ähnlichkeitsmatch mit einem Trigram-Index. Details im ersten der Links, die ich Ihrer letzten Frage hinzugefügt habe.