我正在尝试根据第一个表中的字符串是否包含在第二个表中的长字符串的一部分中来连接两个表。我在 SAS 中使用 PROC SQL,但也可以使用数据步骤而不是 SQL 查询。
这段代码在较小的数据集上运行良好,但很快就会陷入困境,因为它必须进行大量的比较。如果它是一个简单的相等检查会很好,但是必须使用该index()
函数会变得很困难。
proc sql noprint;
create table matched as
select A.*, B.*
from search_notes as B,
names as A
where index(B.notes,A.first) or
index(B.notes,A.last)
order by names.name, notes.id;
quit;
run;
B.notes 是一个 2000 个字符(有时完全填充)的文本块,我正在寻找包含 A 中的名字或姓氏的任何结果。
我认为分两步执行它不会获得任何速度优势,因为它已经必须将 A 的每一行与 B 的每一行进行比较(因此检查名字和姓氏并不是瓶颈)。
当我运行它时,我会NOTE: The execution of this query involves performing one or more Cartesian product joins that can not be optimized.
进入我的日志。使用 A=4000 观察和 B=100,000 观察运行它需要 30 分钟才能产生约 1000 个匹配。
有没有办法优化这个?