微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决不区分大小写删除重复项并删除其他表中的所有引用

我需要一些关于更复杂查询的帮助。因此,假设我们有一个tags,其中包含 idvaluecategory,并且我们在 value 列中有很多重复项,例如 {{1 }}、aaa

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

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

  1. 获取所有具有相同值的标签(每一个都降低,使它们区分大小写),除了每组一个
  2. 通过找到的记录删除其他表中该标签的所有记录
  3. 最后删除这些找到的记录,只留下一个例子(在步骤 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
            *,lower(values)) as row_count
        FROM t
    )s
    WHERE row_count >= 2
);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。