MERGE在2个表之间,一个表有1000万行

时间:2016-11-29 18:47:09

标签: sql-server join merge exists

表A
匹配 / 关键字
0 Stackoverflow
1
1 开始 ogle
0 Yandex
1 Twit ter
0 Facebook
0 Teac
表A中的1000万行
关键字列中有聚集索引

表B
匹配 /
1
1 开始
1 Twit
0首页
0车 0铅笔
0钱
0天气
0她的 TableB中共有500行
在字列

处有聚集索引

我的问题
如果TableA 关键字中的匹配项,我想创建一个SQL查询来匹配TableB中的每个单词。并使用 1 更新 TableB.match (TableA.keyword如'+ TableB.word +'')(将匹配

不是关键字匹配的中间部分; (TableA.keyword如''+ TableB.word +'')
例如 - >在Teac 不匹配

我试图使用MERGE

首先尝试;
我试图将关键字与单词匹配并更新TableB
我收到错误,因为TableA中存在多个匹配项且MERGE不允许在目标表中多次更新一次(表B)

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
我得到了我想要的东西,问题是,需要 1小时才能在1000万个关键字中执行500字的查询。

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 中固定这些查找?

1 个答案:

答案 0 :(得分:2)

更新声明就足以满足您的目标。请注意,这可能不会很好地执行,因为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 + '%'
)