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
,等等。每个记录在其他表中也可以有一个外键,因为标记在其他实体中使用
我真的被困在这一点上了。我的脑海中会浮现出这样的想法:
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合同包含更新或删除时的
部分,这将导致自动删除引用数据。您不应该更新其他表格以引用新的合并标记吗?非常感谢,这就成功了