从不同表的另一列中的一列中查找所有值

Posted

技术标签:

【中文标题】从不同表的另一列中的一列中查找所有值【英文标题】:Finding all values from one column within another column in a different table 【发布时间】:2021-12-17 23:17:42 【问题描述】:

我正在尝试遍历表 Keyword_Table 中的列关键字中的所有值,并在列中搜索这些值 Block_of_Text 在另一个表 Raw_Text 中。来自Keyword_Table 的关键字嵌入在Raw_Text.Block_of_Text 的大量文本中。另一个重要的注意事项是 Keyword_Table 大约有 4000 条记录,而表 Raw_Text 大约有 4,000,000 条记录。最后,我希望输出包含一列,其值来自Keyword_Table.Keyword,完整的Raw_Text.Block_of_Text 值包含来自Keyword_Table.Keyword 的相应值。 两个表之间没有共同的值,所以我不能使用我认为没有的连接。

目前我正在尝试使用此代码,但考虑到表格的规模,它的效率极低。我在Raw_Text 中添加了一个名为Corresponding_Keyword 的列

UPDATE [Raw_Text]
SET Corresponding_Keyword =
(
CASE
WHEN Block_of_Text LIKE CONCAT('%','XXXX','%')  Then 'XXXX'
WHEN Block_of_Text LIKE CONCAT('%','YYYY','%')  Then 'YYYY'
WHEN Block_of_Text LIKE CONCAT('%','ZZZZ','%')  Then 'ZZZZ'
END
)

但是在这种情况下不是3个案例,而是4000个。所以显然这个解决方案是不合理的。有没有人对我如何最好地处理这种情况有任何见解。缺少要加入的字段对我来说似乎是个问题,但考虑到大表任务的性质,这是否本质上很困难?谢谢。

【问题讨论】:

Corresponding_Keyword 如果有多个关键字,你想要什么值,例如Block_of_Text 包含所有值 XXXXYYYYZZZZ? 在 T-SQL 中没有有效的解决方案,除非你转向全文搜索之类的东西。问题是必须以一种或另一种方式 4000 LIKEs 发生,而且这并不快,无论您如何编写查询。查询本身可能类似于WITH T AS (SELECT *, (SELECT TOP(1) Keyword FROM Keyword_Table WHERE Block_of_Text LIKE '%' + Keyword + '%' ORDER BY Keyword) AS Lookup_Keyword FROM Raw_Text) UPDATE T SET Corresponding_Keyword = Lookup_Keyword(以及其他方法),但如前所述,速度不快。 如果有多个匹配的关键字,那么我会很高兴最后一个关键字匹配为 Corresponding_Keyword 中的那个。至于这不会很快,这是我所期望的。我感谢您的意见 “Block_of_Text”的数据类型和最大长度是什么? 【参考方案1】:

这样的 JOIN 应该可以工作,但我不确定性能:

SELECT kw.Keyword, t.Block_of_Text
FROM Keyword_Table kw
JOIN Raw_Text t ON t.Block_of_Text LIKE '%' + kw.Keyword + '%'

【讨论】:

以上是关于从不同表的另一列中的一列中查找所有值的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?

如何将一列的列值组合到 MySQL 中的另一列中?

根据列中的状态更改创建触发器并在表的另一列中插入值

如果一列中存在数字,则在另一列中查找与该数字相对应的值

如果同一表的另一列中存在值,如何找到对应的列值

SQL:使用 REGEXP_REPLACE 删除表的另一列中的部分字符串