【问题标题】:update duplicate or similar records in the same table更新同一张表中的重复或相似记录
【发布时间】:2010-08-02 23:29:22
【问题描述】:

我有一个允许插入记录的表,这些记录非常相似,但相差一个或两个列值。例如表中有以下记录:

ID    TITLE                                 URL                             COUNTRY

1494  Hollywood Reporter                    http://www.hollywoodreporter.com    USA
1497  Hollywood Reporter via Drudge Report  http://www.hollywoodreporter.com    NULL
2158  Hollywood Reporter via                http://www.hollywoodreporter.com    NULL

我想更新最后两条记录中 url 相同的国家列。 此外,我还想知道如何按 url 列对表格进行排序,以便将所有重复的 url 组合在一起,或者即使它们与您在某些情况下的相似,例如:

http://www.hollywoodreporter.com       http://www.blog.hollywoodreporter.com

提前致谢。

尝试了以下方法,它在 url 相同的地方工作

UPDATE t1

SET t1.country = t2.country FROM Sources AS t1 加入源作为 t2 ON t1.url = t2.url WHERE t1.url=t2.url;

只是想弄清楚其余的。谢谢大家


更新

我能够编辑具有匹配 url 但类似的记录 http://www.pantagraph.com http://pantagraph.com http://pantagraph.com/titles

没有更新。使用排序和选择时,我可以查看所有这些记录,但是在尝试更新它们时它不起作用。我什至只是尝试了这个简单的版本:

 select * from Sources s
 where s.url like url 

显示记录但更新时不起作用。

update Sources 
set country = s.country 
from Sources s 
 where s.url like url

【问题讨论】:

  • 要回答您的第二个问题,您需要定义“相似”。为了帮助您将来解决第一个问题,请规范您的数据库,以便您将来不会遇到该问题。规范化规则不仅仅是一种学术练习——它们的存在是为了解决现实世界的问题。
  • 类似的意思是它们共享相同的根 url 或域...例如 stackoverflow.comstackoverflow.com/questions 谢谢您的建议...规范化...基础知识...让我试试子查询

标签: sql sql-server-2008


【解决方案1】:

您可以使用子查询:

update  yt
set     country = (
                  select  distinct country 
                  from    YourTable yt2 
                  where   yt.url = yt2.url 
                          and yt2.country is not null
                  )
from    YourTable yt

如果 URL 包含不同的国家/地区,这应该会出错:在这种情况下,您应该调整查询以选择其中一个国家/地区。

根据您的评论,查找具有冲突国家/地区的行:

select  url
,       count(distinct country) as NumberOfCountries
from    YourTable
where   country is not null
group by
        url
,       country
having  count(distinct country) > 1

【讨论】:

  • 是的,我收到以下错误;子查询返回超过 1 个值。当子查询跟在 =, !=, 后面时这是不允许的
  • @vbNewbie:在答案中添加了寻求冲突的查询,希望对您有所帮助
【解决方案2】:

要对 URL 进行排序,请尝试为“域名”添加另一列。您将提取域名 (hollywoodreporter.com),将其存储,然后按该列排序。或者,您可以在 ORDER BY 子句中使用正则表达式,但这可能会导致性能问题。

【讨论】:

    【解决方案3】:
    update table
    set
        table.country = t2.country
    from
        table t2
    where
        table.url = t2.url
        and t2.country is not null
    

    您正在根据 url 将表连接到自身,并从国家字段中包含某些内容的行进行更新。

    但是,如果您有那么多重复的数据,那么您的设计可能很糟糕。如果可以,请尝试规范化数据库。

    【讨论】:

    • 如果每个 URL 有多个国家,这将多次覆盖国家(不一定是坏的)
    • 感谢您的回复。上面也有人告诉我,但尤其是这张表有超过 200 万条记录,我担心我可能会损害数据。我已删除重复项,并且某些列包含相同的值,但记录本身是唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多