我有一个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行。