我将使用for / each循环,使用正则表达式在另一个表(table1
)中的记录的文本信息中搜索不同的名称(table2
)。
SELECT id FROM "table1"
where tags ~* 'south\s?\*?africa'
or description ~* 'south\s?\*?south'
order by id asc;
但我不知道如何把它放在每个循环中!
table1
:
t1ID | NAME
1 | Shiraz
2 | south africa
3 | Limmatplatz
table2
:
t2ID |TAGS | DESCRIPTIONS
101 |shiraz;Zurich;river | It is too hot in Shiraz and Limmatplatz
201 |southafrica;limmatplatz| we went for swimming
我在table1
中有一个名单。另一个表有一些可能包含这些名称的文本信息。
我想要回复table2
的ID,其中包含table1
中包含项目ID的项目。
例如:
t2id | t1id
101 |1
101 |3
201 |2
201 |3
我的表有60,000和550.000行。 我需要使用时间明智高效的方式!
答案 0 :(得分:1)
您不需要循环。一个简单的连接就可以了。
SELECT t2.id AS t2id, t1.id AS t1id
FROM table1 t1
JOIN table1 t2 ON t2.tags ~* replace(t1.name, ' ', '\s?\*?')
OR t2.description ~* replace(t1.name, ' ', '\s?\*?')
ORDER BY t2.id;
但是大表的表现会 糟糕 您可以采取以下措施来改进它:
table2.tags
标准化为单独的1:n表格
如果重复使用标记,则与tag
表的n:m关系(典型情况)。细节:
LATERAL
联接实际使用这些索引。
全文搜索现在可以搜索短语(多个相邻的单词)