Този подход използва генератор на числа и след това просто тества дължината на припокриването:
select x.drug_name, x2.drug_name, MAX(c.seqnum) as OverlapLen
from x cross join
x x2 cross join
(select ROW_NUMBER() over (order by (select NULL)) seqnum
from INFORMATION_SCHEMA.COLUMNS c
) c
where LEFT(x.drug_name, c.seqnum) = LEFT(x2.drug_name, c.seqnum) and
len(x.drug_name) >= c.seqnum and len(x2.drug_name) >= c.seqnum
group by x.drug_name, x.drug_name
order by x.drug_name, OverlapLen desc
Това предполага, че information_schema.columns
има достатъчно редове за по-дългите имена на лекарства.
Това се присъединява към x
към себе си и след това се присъединява към списък с числа. where
клаузата проверява три условия:(1) че лявата част на всяко име на лекарството е една и съща до seqnum; (2) че дължината на всяко наименование на лекарството е по-малка или равна на seqnum.
След това агрегирането взема всяка двойка и избира най-високата стойност на seqnum -- това трябва да е най-дългото съвпадение на подниз.