Sql 使用时删除";拥有;在查询中

Sql 使用时删除";拥有;在查询中,sql,postgresql,Sql,Postgresql,假设我们有下面的SQL查询,它返回重复的电子邮件 SELECT email, COUNT(email) FROM users GROUP BY email HAVING ( COUNT(email) > 1 ) 在上面的例子中,我们如何实际删除那些重复的行?或者只有一个副本,这样它们就不再是副本了?一种方法使用ctid: delete from users where ctid not in (select min(ctid) fr

假设我们有下面的SQL查询,它返回重复的电子邮件

SELECT email, COUNT(email) 
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

在上面的例子中,我们如何实际删除那些重复的行?或者只有一个副本,这样它们就不再是副本了?

一种方法使用
ctid

delete from users
    where ctid not in (select min(ctid)
                       from users
                       group by email
                      );

这将删除每封电子邮件中除一行以外的所有行
ctid
是一个内部行标识符。最好使用用户定义的主键列。

一种方法使用
ctid

delete from users
    where ctid not in (select min(ctid)
                       from users
                       group by email
                      );

这将删除每封电子邮件中除一行以外的所有行
ctid
是一个内部行标识符。最好使用用户定义的主键列。

下面的方法将允许您从表中删除记录,即使您没有主键或唯一标识符

WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY email) AS RN
FROM users
)

DELETE FROM CTE WHERE RN > 1

下面的方法将允许您从表中删除记录,即使您没有主键或唯一标识符

WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY email) AS RN
FROM users
)

DELETE FROM CTE WHERE RN > 1

假设您的主键是
用户
您将如何确定要从这两个用户中删除哪个
用户
?假设您的主键是
用户
的可能重复项?您将如何确定要从这两个用户中删除哪个
用户
@Abelisto. . . 我不明白它是怎么做到的。@Abelisto。这将删除所有行,但每个电子邮件只有一行。*
delete from users
@Abelisto。我不明白它是怎么做到的。@Abelisto。这将删除所有行,但每封电子邮件一行除外。