【问题标题】:How to update a PostgreSQL table with a count of duplicate items如何使用重复项的计数更新 PostgreSQL 表
【发布时间】:2023-04-07 04:24:01
【问题描述】:

我在一个创建大量重复值的程序中发现了两个错误:

  • 创建了“索引”而不是“唯一索引”
  • 重复检查未集成到 4 个扭曲例程之一中

所以我需要进去清理我的数据库。

第一步是用所有重复值的计数来装饰表格(接下来我将寻找第一个值,然后将所有内容迁移过来)

下面的代码有效,我只记得几年前在同一张表上做过类似的“从选择计数更新”,我用一半的代码做了。

有没有更好的写法?

UPDATE 
    shared_link 
SET 
    is_duplicate_of_count = subquery.is_duplicate_of_count 
FROM
    (
        SELECT 
            count(url) AS is_duplicate_of_count 
            , url
        FROM 
            shared_link
        WHERE
            shared_link.url = url
        GROUP BY 
            url
    ) AS subquery
WHERE 
    shared_link.url = subquery.url
;

【问题讨论】:

    标签: sql postgresql duplicates sql-update duplicate-removal


    【解决方案1】:

    除了子查询中无意义(但也无害)的 WHERE 子句之外,您的查询通常都很好:

    UPDATE shared_link 
    SET    is_duplicate_of_count = subquery.is_duplicate_of_count 
    FROM  (
        SELECT url
             , count(url) AS is_duplicate_of_count 
        FROM   shared_link
    --  WHERE  shared_link.url = url
        GROUP  BY url
        ) AS subquery
    WHERE shared_link.url = subquery.url;

    注释子句同

    WHERE  shared_link.url = shared_link.url
    

    因此只消除NULL 值(因为NULL = NULL 不是TRUE),这很可能既不是您的设置也不需要的。


    除此之外,您只能使用别名和更短的名称进一步缩短代码:

    UPDATE shared_link s
    SET    ct = u.ct
    FROM  (
        SELECT url, count(url) AS ct
        FROM   shared_link
        GROUP  BY 1
        ) AS u
    WHERE s.url = u.url;
    

    在 PostgreSQL 9.1 或更高版本中,您也许可以在 一个 SQL 语句中使用聚合函数和窗口函数来执行整个操作(识别欺骗、合并数据、删除欺骗)和data-modifying CTEs - 从而消除了开始额外列的需要。

    【讨论】:

    • 非常感谢,欧文!我还在这台机器上的 8.4.x 分支上。
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2021-05-17
    • 1970-01-01
    • 2014-04-09
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多