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
CODE_NAME_T1 | CODE_NAME_T2
---------------|-----------------
BBX123 | BB
BC/230 | BC
1AC030 | NULL
BB01BC | BB
BB01BC | BC
嗨,在上面的代码中我在join中使用了通配符。我在结果中面临的问题" BB01BC"行出现两次,因为它包含" BB"和" BC"字符。有没有办法只出现一次。所以如果" BB"匹配在" BB01BC"然后它不应该寻找" BC"在里面?基本上只进行一次匹配/查找而不进行更多的匹配/查找?
答案 0 :(得分:1)
以下是使用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;
注意:使用ORDER BY
时,您几乎总是需要TOP
。你似乎对{em>来自T2
的行没有特别感兴趣,你只需要其中一行。如果您具有特定优先级,则添加ORDER BY
以确定优先级。
答案 1 :(得分:0)
这似乎适用于您的情况:
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