2

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

  • 创建了“索引”而不是“唯一索引”
  • 重复检查未集成在 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
;
4

1 回答 1

6

通常,您的查询很好,除了子查询中无意义(但也无害)的 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 = NULLis not 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 语句中使用聚合和窗口函数以及数据修改 CTE来完成整个操作(识别重复数据、合并数据、删除重复数据)- 从而无需在开始时添加额外的列.

于 2012-09-07T18:52:00.903 回答