删除给定查询获取的记录以外的所有记录
Delete all records but one that are fetched by a given query
我有两个表reminder
和reminder_users
,这些表之间有一个外键约束,reminder_users
是子记录。我想要做的是删除这些拖车表中的几个多余行。到目前为止我设法做的是使用以下查询找到冗余行:
select r.name, r.remark, u.user_id, u.deadline , count (*)
from reminder r
inner join reminder_users u on r.id = u.reminder_id
and u.user_id = u.user_id
and u.deadline = u.deadline having count(*)> 1
group by r.name, r.remark, u.user_id, u.deadline
因此冗余行与外键id
绑定并且子记录具有相同的user_id
和相同的deadline
,并且父记录具有相同的名称和同样的话。
having count
子句指出了多余的行,但我想保留其中一条记录,这样 count > 1 就不再是真的了,所以我不能在中使用这个子句删除查询。此外,为了能够从提醒中删除行,首先必须删除 reminder_users 中的子数据。
我想它应该可以通过使用 rowid
和类似 select max (rowid)
的东西来实现,但我不知道如何构造删除查询。
非常感谢任何帮助!
你走在正确的轨道上。您可以 delete duplicate rows 通过删除所有 rowid
不是子查询 return 的那些:
delete reminder
where rowid not in (
select min ( r.rowid )
from reminder r
inner join reminder_users u
on r.id = u.reminder_id
and u.user_id = u.user_id
and u.deadline = u.deadline
group by r.name, r.remark, u.user_id, u.deadline
)
子查询中不需要 having
子句。
注意:这假定每个 reminder
在 reminder_users
中都有一行。如果不是这种情况,这也将删除没有用户的提醒,因为子查询不会 return 它们。
我有两个表reminder
和reminder_users
,这些表之间有一个外键约束,reminder_users
是子记录。我想要做的是删除这些拖车表中的几个多余行。到目前为止我设法做的是使用以下查询找到冗余行:
select r.name, r.remark, u.user_id, u.deadline , count (*)
from reminder r
inner join reminder_users u on r.id = u.reminder_id
and u.user_id = u.user_id
and u.deadline = u.deadline having count(*)> 1
group by r.name, r.remark, u.user_id, u.deadline
因此冗余行与外键id
绑定并且子记录具有相同的user_id
和相同的deadline
,并且父记录具有相同的名称和同样的话。
having count
子句指出了多余的行,但我想保留其中一条记录,这样 count > 1 就不再是真的了,所以我不能在中使用这个子句删除查询。此外,为了能够从提醒中删除行,首先必须删除 reminder_users 中的子数据。
我想它应该可以通过使用 rowid
和类似 select max (rowid)
的东西来实现,但我不知道如何构造删除查询。
非常感谢任何帮助!
你走在正确的轨道上。您可以 delete duplicate rows 通过删除所有 rowid
不是子查询 return 的那些:
delete reminder
where rowid not in (
select min ( r.rowid )
from reminder r
inner join reminder_users u
on r.id = u.reminder_id
and u.user_id = u.user_id
and u.deadline = u.deadline
group by r.name, r.remark, u.user_id, u.deadline
)
子查询中不需要 having
子句。
注意:这假定每个 reminder
在 reminder_users
中都有一行。如果不是这种情况,这也将删除没有用户的提醒,因为子查询不会 return 它们。