sql >> Database >  >> RDS >> PostgreSQL

Twee tabellen samenvoegen in een complexe query (geen uniforme gegevens)

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.



  1. mysql SELECT * WHERE waarde =$row['item']

  2. XML-parserror:junk na documentelement

  3. MySQL - SELECT * IN OUTFILE LOKAAL?

  4. Tekensets en sorteringen in MySQL begrijpen