我有两张桌子 - 一张有句子,另一张有关键词。我想从句子表中选择包含任何关键字的行。
例如:
句
我喜欢我的狗
我最喜欢的食物是意大利面
编程很有趣
关键词
最喜欢的食物
狗
我的目标是返回前两行。
到目前为止,我有:
select a.*
from sentences a
join keywords b
on a.sentences like '%' || b.keywords || '%'
但是我收到错误"执行此查询涉及执行一个或多个无法优化的笛卡尔积连接"
有什么想法吗?提前致谢。也不确定它是否重要但我在SAS 9.4上这样做
答案 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代码针对每个关键字测试每个句子。