问题描述
我需要一些关于更复杂查询的帮助。因此,假设我们有一个表 tags
,其中包含 id
、value
、category
,并且我们在 value
列中有很多重复项,例如 {{1 }}、aaa
等
一个查询会如何删除除一个之外的所有重复项,所以假设最终结果将是 AaA
、aaa
等。此外,每个记录在其他表中都可以有一个外键,因为标签用于其他实体。
我真的被困在这一点上。流程会在我的脑海中:
解决方法
- 查找重复项:
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
*,lower(values)) as row_count
FROM t
)s
WHERE row_count >= 2
);
棘手的部分是外键问题。如果不知道您的实际表结构,就不可能知道如何解决它。如果设计良好,您的 FK 约束包含 ON UPDATE OR DELETE
部分,这会导致自动删除引用数据。