检查列表A中的字符串部分是否存在于另一列表B中

时间:2018-05-17 15:09:26

标签: sql sql-server

目标:检查列表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中的每个字符串。

感谢您的帮助。 :)

1 个答案:

答案 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模式中的通配符,这些通用卡不是高效查询,而且很难优化。