SQL Server Joignez-vous à Wildcard et arrêtez le premier match

IF OBJECT_ID('tempdb..#TABLE1') IS NOT NULL DROP TABLE #TABLE1 IF OBJECT_ID('tempdb..#TABLE2') IS NOT NULL DROP TABLE #TABLE2 CREATE TABLE #TABLE1 ( CODE_NAME_T1 NVARCHAR(20) ) CREATE TABLE #TABLE2 ( CODE_NAME_T2 NVARCHAR(20) ) INSERT INTO #TABLE1(CODE_NAME_T1) VALUES ('BBX123') ,('BC/230') ,('1AC030') ,('BB01BC') INSERT INTO #TABLE2(CODE_NAME_T2) VALUES ('BB') ,('BC') SELECT T1.CODE_NAME_T1, T2.CODE_NAME_T2 FROM #TABLE1 T1 LEFT OUTER JOIN #TABLE2 T2 ON T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%' IF OBJECT_ID('tempdb..#TABLE1') IS NOT NULL DROP TABLE #TABLE1 IF OBJECT_ID('tempdb..#TABLE2') IS NOT NULL DROP TABLE #TABLE2 

RÉSULTAT

 CODE_NAME_T1 | CODE_NAME_T2 ---------------|----------------- BBX123 | BB BC/230 | BC 1AC030 | NULL BB01BC | BB BB01BC | BC 

Salut, dans le code ci-dessus, j'utilise wildcard dans join. Le problème auquel je fais face dans la ligne de résultat "BB01BC" apparaît deux fois car il contient à la fois les caractères "BB" et "BC". Y at-il moyen que cela n'apparaisse qu'une seule fois. Donc, si "BB" est apparié dans "BB01BC" alors il ne devrait pas chercher "BC" dedans? Fondamentalement seulement faire un match / search et ne pas faire plus de correspondance / search?

Voici une méthode utilisant OUTER APPLY :

 SELECT T1.CODE_NAME_T1, T2.CODE_NAME_T2 FROM #TABLE1 T1 OUTER APPLY (SELECT TOP 1 t2.* FROM #TABLE2 T2 WHERE T1.CODE_NAME_T1 LIKE '%' + T2.CODE_NAME_T2 + '%' ) T2; 

Remarque: Vous voulez presque toujours un ORDER BY lorsque vous utilisez TOP . Vous ne semblez pas particulièrement intéressé par quelle rangée de matchs T2 , vous voulez juste l'un d'entre eux. Si vous avez une priorité particulière, ajoutez ORDER BY pour la priorisation.

Cela semble fonctionner pour votre situation: SELECT T1.CODE_NAME_T1, (SELECT TOP 1 T2.CODE_NAME_T2 from #TABLE2 T2 where T1.CODE_NAME_T1 LIKE '%' || T2.CODE_NAME_T2 || '%') FROM #TABLE1 T1