【问题标题】:Remove duplicates by case insensitive and remove all references in other tables按不区分大小写删除重复项并删除其他表中的所有引用
【发布时间】:2021-04-25 18:17:27
【问题描述】:

对于更复杂的查询,我需要一些帮助。所以假设我们有一个表tags,其中包含idvaluecategory,我们在value 列中有很多重复项,例如aaaAaA 等。

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

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

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

【问题讨论】:

  • 您不应该更新其他表以引用新的合并标签吗?

标签: postgresql duplicates sql-delete


【解决方案1】:

demo:db<>fiddle

  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。

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多