有没有办法在sql db中搜索包含类似值的字段? 例如,我有一个超过一百万条记录的表,其中一列包含网址值并与国家/地区列相关联。以前我尝试匹配相同的网址,其中包含国家/地区的空值,因为能够使用以下内容更新它:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url = t2.url;
然后我改变了查询以使用如下所示的单词:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url = t2.url
WHERE t1.url like t2.url;
当我只使用select语句查找url所在的记录时,我得到了结果,但更新不起作用。 一个更好的例子如下:
这些都是相同的域名网址,我只想更新每个域名的国家/地区列,以避免手动执行,因为大约有200000个要做。
答案 0 :(得分:1)
怎么样:
UPDATE t1
SET t1.country = t2.country
FROM Sources AS t1
JOIN sources AS t2
ON t1.url LIKE t2.url
查看在数据集上运行时所获得的连接类型......可能会产生太多不良匹配。
在某些时候,您可能需要根据网址的确切部分进行一些匹配,但我不知道如何在这样的查询中执行此操作。有关信息,请参阅此链接:
http://www.w3schools.com/SQL/sql_wildcards.asp
哦,如果所有网址都包含http://www。您可以随时执行
之类的操作 WHERE left(t1.url,16) = left(t1.url,16)
这可能会缩短您的执行时间,并且可以更好地加入
答案 1 :(得分:1)
首先,我没有看到您的两个查询如何返回不同的结果。在这两种情况下,您都要求Url完全匹配ON子句。
其次,如果Sources
表中有两行具有相同的网址但国家/地区不同,您认为会发生什么?这是在UPDATE语句中使用FROM子句时要小心的原因之一(以及ANSI标准未正式支持的原因之一)。如果两行具有相同的Urls但国家/地区不同,则需要确定哪一行将获胜。让我们假设排名最低的一个将获胜:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url = Sources.Url
)
如果你想要“类似”的网址,我们首先需要知道你是如何定义“相似”的。使用没有通配符的LIKE实际上与使用=
相同。如果您使用前导通配符(例如LIKE ('%' + Url)
),则最终会在百万行表上执行表扫描。但是,如果我们只使用尾随通配符(例如LIKE (Url + '%')
),那么SQL仍然可以使用索引:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url Like ( Sources.Url + '%' )
)
修改强>
在稍后的评论中,暗示您只想更新具有NULL国家/地区值的行。如果这是真的,则需要添加一个WHERE子句:
Update Sources
Set Country = (
Select Min(T2.Country)
From Sources As T2
Where T2.Url = Sources.Url
)
Where Country Is Null