Я пытаюсь объединить две таблицы на основе того, содержится ли строка из первой таблицы в части длинной строки во второй таблице. Я использую PROC SQL в SAS, но также могу использовать шаг данных вместо 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 с каждой строкой 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 матчей.
Есть ли способ это оптимизировать?
, чтобы сделать это более похожим на SQL, я попытался добавить% до и после A.First и A.Last, а затем используя 'where B.notes LIKE A.first' и выпустил ту же самую ноту и ту же самую длительную версию. Я надеялся, что использование функции SQL вместо функции SAS позволит ей оптимизировать, но я думаю, что нет. – orh
Вы пытаетесь сделать левое или внутреннее соединение, или действительно декартовой продукт? Вы просто хотите, чтобы данные из B были объединены в A, когда B.NOTES содержит одно из полей? – DomPazz
Да, мне просто нужен набор результатов, в которые поля из A включены в B.notes (считая, что может быть несколько результатов с обеих сторон, так как может иметь несколько вещей) – orh