目标:检查列表A中的部分字符串是否存在于另一列表B
中我想检查表B的任何描述是否适合A组中的某些字符串(即使它位于字符串的中间或最后)。
表:
表A
Id Group Present
-------------------------------
1 xyz dfdf NULL
2 xyz aaa NULL
3 34z df retrnkr NULL
4 uu rtz win fd aa zz NULL
5 uu rtz win sd er tr NULL
-------------------------------
表B
Id Description CreationDate
-----------------------------
1 xyz aaa 2018-05-14
2 rtz win sd 2018-05-14
3 rtz win fd 2018-05-14
4 rtr aaa 2018-05-14
5 rre 2018-05-14
6 gwe 2018-05-14
------------------------------
表A中的最终结果。 Present是一个布尔变量,它有bit作为数据类型。如果表B中存在组,则为1,否则为0.
Id Group Present
-------------------------------
1 xyz dfdf 0
2 xyz aaa 1
3 34z df retrnkr 0
4 uu rtz win fd aa zz 1
5 uu rtz win sd er tr 1
-------------------------------
我试过
update table A
set Present=1
Where table A.[group] like '%' + (SELECT TOP 1 Description from Table B) + '%'
但它仅用于检查表A中的任何字符串中是否存在第一个描述...(组中的字符串超过3000个字符)。我需要运行表B中的所有描述,看看是否有任何(只有一个!)适合表A中的每个字符串。
感谢您的帮助。 :)
答案 0 :(得分:2)
您可以使用join
:
update a
set Present = 1
from a join
b
on a.[group] like '%' + b.description + '%';
或者,使用exists
:
update a
set present = 1
where exists (select 1 from b where a.[group] like '%' + b.description + '%');
由于like
模式中的通配符,这些通用卡不是高效查询,而且很难优化。