SQLITE3 - 删除具有相同值的多个列的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLITE3 - 删除具有相同值的多个列的行相关的知识,希望对你有一定的参考价值。

我有一个SQLite3数据库,我想从中删除具有两个相同值的字段的行。看来我可以用这个查询选择这样的值: SELECT * FROM mydb GROUP BY user_id, num HAVING COUNT(*) > 1 但是我无法删除它们。 DELETE FROM mydb WHERE user_id IN (SELECT * FROM mydb GROUP BY user_id, num HAVING COUNT(*) > 1) 返回语法错误。

这就是我的期望:

例:

id  user_id     num
1   1           1
2   1           1
3   2           1
4   1           2
5   2           2

在此示例中,id 1和2具有相同值的列(user_id和num),因此应删除它们。优选地,但不一定我希望有一种解决方案,只留下一行(无论哪一行)。

结果:

id  user_id     num
2   1           1
3   2           1
4   1           2
5   2           2

注意:id是主键。 user_id是外键。 num是INTEGER。

答案

您遇到语法错误,因为您的IN运算符左侧有一个值(user_id),而右侧有一个非单值行的表(SELECT *)。比较喜欢; WHERE user_id IN (SELECT user_id ...)避免它。

无论如何,这是一个删除所有但最新的查询:

DELETE FROM mydb
WHERE id NOT IN (
  SELECT MAX(id) FROM mydb
  GROUP BY user_id, num
);

对于每个独特的id组合,子查询将返回最高的(user_id, num)。然后我们只删除所有其他行。即在您的示例中,子查询将返回2,3,4,5作为“正确”,这将导致删除第1行。

以上是关于SQLITE3 - 删除具有相同值的多个列的行的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite3 从列中具有相似值的行获取数据

连接具有相同值的行的列值(不同列的)

在保留列的同时计算具有相同值的行

如何在 MySQL 中删除具有几个相同值的行?

根据另一列的字段值选择具有相同列值的行

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项