Postgresql 使用select语句删除记录

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;

我必须删除计数大于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;          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);