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

问题描述 投票:0回答:1

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

sqlite
1个回答
1
投票

您遇到语法错误,因为您的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行。

© www.soinside.com 2019 - 2024. All rights reserved.