Postgresql 按不区分大小写删除重复项,并删除其他表中的所有引用

Postgresql 按不区分大小写删除重复项,并删除其他表中的所有引用,postgresql,duplicates,sql-delete,Postgresql,Duplicates,Sql Delete,我需要一些关于更复杂查询的帮助。假设我们有一个表tags,它包含id,value,category,在value列中有很多重复项,比如aaa,aaa,等等 如果一个查询删除除一个之外的所有重复项,那么最终结果将是aaa,bbb,等等。每个记录在其他表中也可以有一个外键,因为标记在其他实体中使用 我真的被困在这一点上了。我的脑海中会浮现出这样的想法: 获取所有具有相同值的标记(降低每个标记的值,使其区分大小写),但每组中的一个标记除外 通过这些找到的记录删除其他表中所述标签的所有记录 最后,删除这

我需要一些关于更复杂查询的帮助。假设我们有一个表
tags
,它包含
id
value
category
,在
value
列中有很多重复项,比如
aaa
aaa
,等等

如果一个查询删除除一个之外的所有重复项,那么最终结果将是
aaa
bbb
,等等。每个记录在其他表中也可以有一个外键,因为标记在其他实体中使用

我真的被困在这一点上了。我的脑海中会浮现出这样的想法:

  • 获取所有具有相同值的标记(降低每个标记的值,使其区分大小写),但每组中的一个标记除外
  • 通过这些找到的记录删除其他表中所述标签的所有记录
  • 最后,删除这些已找到的记录,并只留下每个记录的一个示例(在步骤1中已排除)
  • 查找重复项:
  • row\u number()
    窗口函数向组的每条记录添加行计数。因此,您的组可以是category,其中的所有值在转换为小写(
    lower()
    )后都相等。现在,重复项都是行计数大于等于2的值

    SELECT 
        id
    FROM (
        SELECT
            *,
            row_number() OVER (PARTITION BY category, lower(values)) as row_count
        FROM t
    )s
    WHERE row_count >= 2
    
  • 删除重复项:
  • 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合同包含更新或删除时的
    部分,这将导致自动删除引用数据。

    您不应该更新其他表格以引用新的合并标记吗?非常感谢,这就成功了