Postgresql 使用select语句删除记录
我必须删除计数大于1的记录。为此,在第一步,我需要从计数大于1的Postgresql 使用select语句删除记录,postgresql,Postgresql,我必须删除计数大于1的记录。为此,在第一步,我需要从计数大于1的custd表中选择rec\u id,并删除该特定rec\u id的数据,但id值最高的rec\u id除外 select rec_id , field_id, count(*) from mst.custom_data cd group by rec_id, field_id having count(*) > 1; 输出如下所示: rec_id field_id count 141761; 3;
custd
表中选择rec\u id
,并删除该特定rec\u id
的数据,但id值最高的rec\u id
除外
select rec_id , field_id, count(*)
from mst.custom_data cd
group by rec_id, field_id
having count(*) > 1;
输出如下所示:
rec_id field_id count
141761; 3; 2
117460; 7; 2
141970; 2; 2
因此,应该删除上面包含最少id的项。我们可以在此处尝试使用相关子查询:
DELETE
FROM mst.custom_data m1
WHERE EXISTS (SELECT 1 FROM mst.custom_data m2
WHERE m1.rec_id = m2.rec_id AND m1.field_id = m2.field_id
GROUP BY rec_id, field_id
HAVING COUNT(*) > 1 AND MAX(m2.id) > m1.id);
如果考虑删除的外部
id
值始终小于给定(rec\u id,field\u id)
组的最大id,则相关子查询将返回该组值的记录。这是您请求的逻辑。子查询中1有什么用途?它选择了什么?@akhileshkedarisetty我补充了一个解释。另外,请让我知道这个查询是否对您有效。是的,它工作得非常好。。。。!!!!但是我对查询有点困惑,您能告诉我,当您使用select 1时,内部查询的输出是什么吗?在delete语句中,我们甚至没有提到id在哪里(子查询)…那么它如何知道只删除那些特定的记录?从子查询中删除语句搜索将删除什么?如果不给您一个SQL基础教程(这超出了单个SO问题的范围),我真的无法解释更多内容。
id field_id rec_id
200; 3; 141761
53791; 3; 141761
DELETE
FROM mst.custom_data m1
WHERE EXISTS (SELECT 1 FROM mst.custom_data m2
WHERE m1.rec_id = m2.rec_id AND m1.field_id = m2.field_id
GROUP BY rec_id, field_id
HAVING COUNT(*) > 1 AND MAX(m2.id) > m1.id);