SQL查询 - 两个表之间的匹配数据

Posted

技术标签:

【中文标题】SQL查询 - 两个表之间的匹配数据【英文标题】:SQL query - matching data between two tables 【发布时间】:2016-08-22 12:42:44 【问题描述】:

我有 2 张桌子,即;

在 TableA 中大约有 1000 万行, 在 TableB 中大约有 500k 行

TableA (10million rows)
Url
-------------------------------------------
http://www.example.com/data/tuesday-morning
http://www.example.com/data/wednesday-evening



TableB (500k rows)
Keyword          Value
---------       ----------
Sunday              0
Monday              0
Tuesday             0
Wednesday           0

我想在TableA中搜索TableB中的所有关键字,并找到匹配项,将它们的Value更新为1

我使用 MERGE,但问题是搜索至少需要 10 个小时。

我会每天进行搜索,因为 TableB 中的关键字每天都会更新

MERGE INTO TableB As TB 
USING (Select Url From TableA) As TA 
ON TA.Url LIKE 'http://www.example.com/data/'+TB.Keyword+'-%' 
WHEN MATCHED THEN 
UPDATE SET TB.Value=1;

在这两个表之间进行最快查找的最佳 SQL 查询是什么?

非常感谢

【问题讨论】:

摆脱(Select Url From TableA) ,这肯定会减慢您的查询速度,只使用TableA 使用这一行金额的唯一方法 - 使用全文索引。也就是说 - 采用 tinka (***.com/a/39080778/2746150) 下面提出的方法,但您必须将 like '%'+t2.keyword+'%' 替换为特定于全文索引的语言结构,这样更快。 【参考方案1】:

如果我了解您的 Q 可能这个解决方案会对您有所帮助,您可以通过 ID 或其他方式应用一些 WHERE 子句,这样您就可以纠正您的记录发生的情况,首先应用少量数据,然后您可以应用所有数据。

 -- declare table1
 declare @table1 table
 (url varchar(max))

 insert into @table1
 values
 ('http://www.example.com/data/tuesday-morning'),
 ('http://www.example.com/data/tuesday-morning'),
 ('http://www.example.com/data/noday-morning')


 -- declare table2
 declare @table2 table
 (keyword varchar(33), val int)

 insert into @table2
 values
 ('monday',0),
 ('tuesday',0)

 -- select
 select * from 
 @table1 t1 join
 @table2 t2 on t1.url like '%'+t2.keyword+'%'

 -- update
 update
 @table2 
 set val =1 
 from 
 @table1 t1 join
 @table2 t2 on t1.url like '%'+t2.keyword+'%'

  -- select again
 select * from 
 @table1 t1 join
 @table2 t2 on t1.url like '%'+t2.keyword+'%'

【讨论】:

以上是关于SQL查询 - 两个表之间的匹配数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据

使用T-SQL实现多表查询

连接两个表并从一列返回多个匹配项的 SQL 查询?

两个表查询(SQL 和 ColdFusion)中的匹配值

两个表之间的查询慢

用SQL查询两个表中相同的数据