Questo approccio utilizza un generatore di numeri e quindi verifica solo la lunghezza della sovrapposizione:
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
Ciò presuppone che information_schema.columns
dispone di righe sufficienti per i nomi dei farmaci più lunghi.
Questo si unisce a x
a se stesso e quindi si unisce a un elenco di numeri. Il where
la clausola sta verificando tre condizioni:(1) che la parte sinistra del nome di ogni farmaco sia la stessa fino al seqnum; (2) che la lunghezza di ciascun nome di farmaco sia inferiore o uguale a seqnum.
L'aggregazione prende quindi ogni coppia e sceglie il valore più alto di seqnum:questa dovrebbe essere la corrispondenza della sottostringa più lunga.