Postgresql
更新與另一個表的列中匹配單詞的連接條件
我有 2 個如下所示的表:
表 A:
CREATE TEMP TABLE table_a ( Column_1 text, ID_number int ); INSERT INTO table_a VALUES ('foo,bar,baz', 123), ('qux,quux,quuz',456), ('corge,grault,garply',789), ('qux,bar,grault', 101);
表 B:
CREATE TEMP TABLE table_b ( Column_1 text, Column_2 text, ID_number int ); INSERT INTO table_b VALUES ('foo','baz',null), ('qux','quzz',null), ('corge','garply',null);
我正在嘗試複製表 A 中 ID_number 列中的值,其中表 B 的第 1 列和第 2 列中的值可以在表 A 的第 1 列的同一行中找到。
這就是我正在考慮的事情:
UPDATE table_b AS B SET id_number = A.id_number FROM table_a AS A WHERE A.column_1 LIKE B.column_1 AND A.column_1 LIKE B.column_2
..但顯然這不起作用。
如何將其轉換為正確的查詢?
附加資訊
table_a.Column_1
包含英國地址,例如:'47 BOWERS PLACE, GREAT YARMOUTH, NORFOLK, NR20 4AN'
我在(so, )
table_b
中有地址的第一行,在.Column_1``'47 BOWERS PLACE'``'NR20 4AN'``Column_2
我認為最好簡化一些事情,但也許實際數據在這種情況下有一些相關性。
table_a
有大約 3000 萬個地址。table_b
有大約 60k 行。性能是相關的,它執行得越快越好,並且將來可能會重複。
假設Postgres 9.6,性能是相關的,大表,由字元組成的“單詞”,沒有空格或標點符號,沒有詞乾或停止詞,沒有片語,所有列
NOT NULL
。由索引支持的全文搜尋應該是最快的解決方案之一:
UPDATE table_b b SET id_number = a.id_number FROM table_a a WHERE to_tsvector('simple', a.column_1) @@ plainto_tsquery('simple', concat_ws(' ', b.column_1, b.column_2)) AND b.id_number = a.id_number; -- prevent empty UPDATEs
在 上具有匹配的表達式索引
a.column_1
:CREATE INDEX table_a_column_1_idx ON table_a USING GIN (to_tsvector('simple', column_1));