sql >> Database teknologi >  >> RDS >> Sqlserver

Find alle strenge, der deler mindst X tegn, sorteret efter lighed

Denne tilgang bruger en talgenerator og tester derefter blot længden af ​​overlapning:

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

Dette forudsætter, at informationsskema.kolonner har rækker nok til de længere lægemiddelnavne.

Dette forbinder x til sig selv og slutter sig derefter til en liste med numre. hvor klausul er at kontrollere tre betingelser:(1) at den venstre del af hvert lægemiddelnavn er den samme op til seqnum; (2) at længden af ​​hvert lægemiddelnavn er mindre end eller lig med seqnum.

Aggregeringen tager derefter hvert par og vælger den højeste værdi af seqnum -- dette bør være det længste understrengmatch.



  1. Skal forbindelsestabeller have mere end én primær nøgle fra en anden identifikationstabel?

  2. MySql-databasedesign til et quizprogram

  3. Summationsforespørgsel ved hjælp af groupBy() funktion i laravel

  4. Forbedring af MySQL-ydeevne med avancerede InnoDB-indstillinger