更新sql server中的类似字段

时间:2010-08-03 12:46:00

标签: sql sql-server-2008

有没有办法在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个要做。

2 个答案:

答案 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