Sql server 在两个表之间合并,一个表包含1000万行

Sql server 在两个表之间合并,一个表包含1000万行,sql-server,join,merge,exists,Sql Server,Join,Merge,Exists,表a 匹配/关键字 0堆栈溢出 1你管 1Google 0 Yandex 1Twitter 0 Facebook 0教师 表A中总共有1000万行 关键字列处有聚集索引 表b 匹配/单词 1你 1Go 1Twit 0主页 0辆车 0铅笔 0钱 0天气 0她 表B中总共500行 word列中有聚集索引 我的问题 如果TableA关键字s中匹配,我想进行一次sql查询,以匹配TableB中的每个单词。并用1 (TableA.keyword,如“+TableB.word+”%”)(将匹配) 不是中间的

表a
匹配/关键字
0堆栈溢出
1
1Google
0 Yandex
1Twitter
0 Facebook
0教师
表A中总共有1000万行
关键字列处有聚集索引

表b
匹配/单词
1
1Go
1Twit
0主页
0辆车
0铅笔
0钱
0天气
0她
表B中总共500行
word列中有聚集索引

我的问题
如果TableA关键字s中匹配,我想进行一次sql查询,以匹配TableB中的每个单词。并用1
(TableA.keyword,如“+TableB.word+”%”)(将匹配)

不是中间的关键字匹配;(TableA.keyword,如“%”+TableB.word+”%”)
例如,Teac中的她的(不匹配)

我尝试使用合并

第一次尝试
我尝试将关键字与单词匹配,并更新TableB
我得到一个错误,因为TableA中有多个匹配项,MERGE不允许对目标表(TableB)中的一行进行多次更新

第二次尝试
我尝试用关键词匹配单词并更新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;

是否有在第二次尝试中加快这些查找的选项

一条update语句就足以满足您要做的事情。请注意,这可能不会执行得很好,因为SQL不擅长比较字符串

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

insert into @a values (0, 'Stackoverflow')
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 + '%'
)

为什么在这里使用合并?似乎你只是在做一些匹配的事情。这应该是一个update语句。无论你如何看待这一点,表现都将是可怕的。您正在进行通配符搜索,查找1000万行中是否存在500个单词。索引在这里一点帮助都没有。因此,如果表B中的一个单词出现在表a中的任何位置,您希望它具有match=1,否则为0?并且表B中的单词必须位于表a的开头?如果存在匹配,您是否也希望表a中的match=1?是的,在表a中关键字列的起始位置的任何位置。并将TableB.match列更新为1。不,我不想更新TableA,谢谢将“where关键字in”改为“where exists”将有助于这里的性能。@SeanLange-hmm,我试过了,它将所有内容都标记为1贪婪。没有任何代码能让这一切变得如此缓慢,只有1000万行。DForck42谢谢@SeanLange您的代码帮助我在4-5秒内执行查询,而不是在MERGE+1下一小时执行查询Thanks@G.KISA如果此代码为您工作,那么您应该考虑将此标记为已接受的答案。
update b
set match = 1
from @b b
where exists
(
    select b.keyword
    from @a a
    where a.keyword like b.keyword + '%'
)