在 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 + '%'
)
表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 + '%'
)