Essa abordagem usa um gerador de números e, em seguida, apenas testa o comprimento da sobreposição:
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
Isso pressupõe que
information_schema.columns
tem linhas suficientes para os nomes de medicamentos mais longos. Isso une
x
para si mesmo e, em seguida, junta-se a uma lista de números. O where
cláusula está verificando três condições:(1) que a parte esquerda de cada nome do medicamento seja a mesma até o seqnum; (2) que o comprimento de cada nome de droga é menor ou igual a seqnum. A agregação então pega cada par e escolhe o valor mais alto de seqnum -- esta deve ser a correspondência de substring mais longa.