表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 中固定这些查找?
答案 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 + '%'
)