Detta tillvägagångssätt använder en nummergenerator och testar sedan bara längden på överlappningen:
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
Detta förutsätter att information_schema.columns
har tillräckligt med rader för de längre läkemedelsnamnen.
Detta ansluter till x
till sig själv och går sedan med i en lista med nummer.
Aggregeringen tar sedan varje par och väljer det högsta värdet av sekvensnummer -- detta bör vara den längsta delsträngsmatchningen.