不区分大小写删除重复项并删除其他表中的所有引用
Remove duplicates by case insensitive and remove all references in other tables
我需要一些关于更复杂查询的帮助。假设我们有一个 table tags
,其中包含 id
、value
、category
,并且我们在 value
列中有很多重复项像 aaa
、AaA
等
一个查询看起来如何删除除一个之外的所有重复项,所以假设最终结果将是 aaa
、bbb
等。而且每条记录可以有一个 foreign_key 在其他 table 中,因为标签在其他实体中使用。
我真的卡在这一点上了。流程将在我的脑海中:
- 获取所有具有相同值的标签(降低每个标签,使它们区分大小写),除了每个组中的一个标签
- 根据找到的记录删除其他tables
中该标签的所有记录
- 最后删除这些找到的记录,每个只留下一个示例(在步骤 1 中将被排除)
- 查找重复项:
row_number()
window 函数向组中的每条记录添加行计数。因此,您的组可以是类别,其中所有值在转换为小写字母 (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
);
棘手的部分是外键问题。不知道您实际的 table 结构,就不可能知道如何解决它。如果设计得好,您的 FK 约束包含一个 ON UPDATE OR DELETE
部分,这会导致自动删除引用数据。
我需要一些关于更复杂查询的帮助。假设我们有一个 table tags
,其中包含 id
、value
、category
,并且我们在 value
列中有很多重复项像 aaa
、AaA
等
一个查询看起来如何删除除一个之外的所有重复项,所以假设最终结果将是 aaa
、bbb
等。而且每条记录可以有一个 foreign_key 在其他 table 中,因为标签在其他实体中使用。
我真的卡在这一点上了。流程将在我的脑海中:
- 获取所有具有相同值的标签(降低每个标签,使它们区分大小写),除了每个组中的一个标签
- 根据找到的记录删除其他tables 中该标签的所有记录
- 最后删除这些找到的记录,每个只留下一个示例(在步骤 1 中将被排除)
- 查找重复项:
row_number()
window 函数向组中的每条记录添加行计数。因此,您的组可以是类别,其中所有值在转换为小写字母 (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
);
棘手的部分是外键问题。不知道您实际的 table 结构,就不可能知道如何解决它。如果设计得好,您的 FK 约束包含一个 ON UPDATE OR DELETE
部分,这会导致自动删除引用数据。