首页 > 解决方案 > 通过不区分大小写删除重复项并删除其他表中的所有引用

问题描述

对于更复杂的查询,我需要一些帮助。因此,假设我们有一个tags包含id,的表value,并且列category中有很多重复项,例如,等。valueaaaAaA

查询如何删除除一个之外的所有重复项,因此假设最终结果将是aaa,bbb等。此外,每条记录在其他表中都可以有一个 foreign_key,因为标签在其他实体中使用。

我真的被困在这一点上。流程会在我的脑海中:

  1. 获取具有相同值的所有标签(降低每个标签,使其区分大小写),每个组中的一个除外
  2. 通过那些找到的记录删除其他表中该标记的所有记录
  3. 最后删除这些找到的记录,只留下一个例子(这将在步骤 1 中被排除)

标签: postgresqlduplicatessql-delete

解决方案


演示:db<>小提琴

  1. 查找重复项:

窗口函数将row_number()行计数添加到组的每条记录。因此,您的组可以是类别,并且在将它们转换为小写 ( lower()) 之后,所有值都等于。重复项现在是所有行数 >= 2 的值。

SELECT 
    id
FROM (
    SELECT
        *,
        row_number() OVER (PARTITION BY category, lower(values)) as row_count
    FROM t
)s
WHERE row_count >= 2
  1. 删除重复项:

DELETE在语句中使用上面的查询

DELETE FROM t
WHERE id IN (
    SELECT 
        id
    FROM (
        SELECT
            *,
            row_number() OVER (PARTITION BY category, lower(values)) as row_count
        FROM t
    )s
    WHERE row_count >= 2
);

棘手的部分是外键问题。如果不知道您的实际表结构,就不可能知道如何解决它。如果设计得好,您的 FK 约束包含一个ON UPDATE OR DELETE部分,这会导致自动删除参考 dat。


推荐阅读