如何从包含SQL中另一个表的关键字的1个表中选择行?

时间:2015-11-28 21:33:39

标签: sql indexing sas keyword contains

我有两张桌子 - 一张有句子,另一张有关键词。我想从句子表中选择包含任何关键字的行。

例如:

  • 我喜欢我的狗

  • 我最喜欢的食物是意大利面

  • 编程很有趣

关键词

  • 最喜欢的食物

我的目标是返回前两行。

到目前为止,我有:

select a.*

from sentences a

join keywords b

on a.sentences like '%' || b.keywords || '%'

但是我收到错误"执行此查询涉及执行一个或多个无法优化的笛卡尔积连接"

有什么想法吗?提前致谢。也不确定它是否重要但我在SAS 9.4上这样做

1 个答案:

答案 0 :(得分:1)

在这种代码中有几个问题需要防范,但主要关注点是:搜索关键字中的前导和尾随空格,字符大小写匹配(大多数SAS字符比较区分大小写),重复匹配(多个关键字匹配一个)句)。

下面的代码模式应该处理这些问题。

select distinct a.*
from sentences a cross join keywords b
where findw(a.sentences,b.keywords,' ','ir');

“distinct”参数将删除重复匹配,而findw函数指定使用空格''作为唯一关注的分隔符,'ir'指定不区分大小写(修饰符'i')并删除前导和尾随分隔符/ spaces(修饰符'r'与''作为分隔符的组合)。

根据所涉及的数据大小,您可以通过使用数据步骤和哈希表来获得更好的性能。这将允许您停止测试第一个关键字匹配的句子。 sql代码针对每个关键字测试每个句子。