在 2 table 秒之间合并,一个 table 有 1000 万行

MERGE between 2 tables, one table with 10million rows

表A
匹配 / 关键字
0 计算器
1
1
0 Yandex
1 推特之三
0 脸书
0 蒂克
TableA 共有 1000 万行
关键字列有聚簇索引

表B
匹配 / 单词
1
1
1 推特
0 家
0 辆车
0 支铅笔
0 钱
0 天气
0 个她
TableB 共有 500 行
word列有聚簇索引

我的问题
如果匹配表 A 关键字,我想进行 sql 查询以匹配表 B 中的每个 。并将 TableB.match 更新为 1
(TableA.keyword like '+TableB.word+'%') (会匹配)

中间关键字不匹配; (TableA.keyword喜欢'%'+TableB.word+'%')
例如 Her -> 在 Teacher不会被匹配

我尝试使用 MERGE

第一次尝试;
我尝试将关键字与单词进行匹配并更新 TableB
我收到错误,因为 TableA 中有多个匹配项,并且 MERGE 不允许在 Target table (TableB)
[=13= 中多次更新一行]

MERGE INTO [TableB] As XB 
USING (Select keyword FROM [TableA]) As XA 
ON XB.word LIKE ''+XA.keyword+'%' 
WHEN MATCHED THEN UPDATE SET XB.match=1;

第二次尝试;
我尝试将单词与关键字匹配并更新 TableA
我得到了我想要的,问题是,执行 1000 万个关键字中 500 个词的查询需要 1 小时

MERGE INTO [TableA] As XA 
USING (Select word FROM [TableB]) As XB 
ON XB.word LIKE ''+XA.keyword+'%' 
WHEN MATCHED THEN UPDATE SET XA.match=1;

是否可以选择在 SecondTry 中加强这些查找?

更新语句足以满足您的要求。请注意,这可能不会很好地执行,因为 SQL 不擅长比较字符串。

declare @a table (match int, keyword varchar(50))
declare @b table (match int, keyword varchar(50))

insert into @a values (0, 'Whosebug')
insert into @a values (0, 'Youtube')
insert into @a values (0, 'Google')
insert into @a values (0, 'Yandex')
insert into @a values (0, 'Twitter')
insert into @a values (0, 'Facebook')
insert into @a values (0, 'Teacher')


insert into @b values (0, 'You')
insert into @b values (0, 'Go')
insert into @b values (0, 'Twit')
insert into @b values (0, 'Home')
insert into @b values (0, 'Car')
insert into @b values (0, 'Pencil')
insert into @b values (0, 'Money')
insert into @b values (0, 'Weather')
insert into @b values (0, 'Her')

--commented out because user didn't want this, but it matches the provided data
--update @a
--set match = 1
--where keyword in
--(
--  select 
--      distinct a.keyword
--  from @a a
--  cross apply @b b
--  where a.keyword like b.keyword + '%'
--)

update @b
set match = 1
where keyword in
(
    select 
        distinct b.keyword
    from @a a
    cross apply @b b
    where a.keyword like b.keyword + '%'
)

select *
from @a

select *
from @b

——肖恩编辑—— 以下是如何将其作为相关子查询执行此操作,以便您可以使用 EXISTS。

update b
set match = 1
from @b b
where exists
(
    select b.keyword
    from @a a
    where a.keyword like b.keyword + '%'
)