Postgresql

更新與另一個表的列中匹配單詞的連接條件

  • February 3, 2017

我有 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));

引用自:https://dba.stackexchange.com/questions/162449