我有一个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是一个整数。
答案 0 :(得分:1)
您遇到语法错误,因为您的IN
运算符的左侧是一个单一值(user_id
),而右侧则是一个非单值行的表格({{1} }。比较喜欢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
。然后,我们只删除所有其他行。即在您的示例中,子查询将返回2、3、4、5为“正确”,这将导致删除第1行。