postgresql - 通过不区分大小写删除重复项并删除其他表中的所有引用
问题描述
对于更复杂的查询,我需要一些帮助。因此,假设我们有一个tags
包含id
,的表value
,并且列category
中有很多重复项,例如,等。value
aaa
AaA
查询如何删除除一个之外的所有重复项,因此假设最终结果将是aaa
,bbb
等。此外,每条记录在其他表中都可以有一个 foreign_key,因为标签在其他实体中使用。
我真的被困在这一点上。流程会在我的脑海中:
- 获取具有相同值的所有标签(降低每个标签,使其区分大小写),每个组中的一个除外
- 通过那些找到的记录删除其他表中该标记的所有记录
- 最后删除这些找到的记录,只留下一个例子(这将在步骤 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
- 删除重复项:
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。
推荐阅读
- c# - Net Core:将 Exif 数据添加到图像
- kubernetes - 在 OpenShift 上以 root 权限启动 pod
- angular - Angular.json - 为测试设置默认配置
- javascript - 如何从服务器到客户端的第二次发布请求中显示错误
- python - 如何从 sympy 中的 NotImplementedError 获取值?
- mysql - MySQL,确定在某个商店进行首次交易的客户数量
- node.js - node-tunnel/node-https:如果认证参数错误或任何代理参数错误,则抛出异常
- git - 防止从除开发人员之外的所有分支进行拉取请求
- php - mpdf->writePdfType() 使用示例
- flutter - ValueKey 无法与动画构建器一起正常工作 - 颤动