Pendekatan ini menggunakan generator angka dan kemudian hanya menguji panjang tumpang tindih:
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
Ini mengasumsikan bahwa information_schema.columns
memiliki baris yang cukup untuk nama obat yang lebih panjang.
Ini bergabung dengan x
untuk dirinya sendiri dan kemudian bergabung dalam daftar nomor. where
klausa yang memeriksa tiga kondisi:(1) bahwa bagian kiri setiap nama obat sama sampai seqnum; (2) bahwa panjang setiap nama obat kurang dari atau sama dengan seqnum.
Agregasi kemudian mengambil setiap pasangan dan memilih nilai seqnum tertinggi -- ini harus menjadi kecocokan substring terpanjang.