比方说,我们有一个返回的电子邮件删除,而使用“具有”查询
SELECT email, COUNT(email)
FROM users
GROUP BY email
HAVING (COUNT(email) > 1)
在上述情况下重复下面的SQL查询,如何才能真正删除那些重复的行?或只有一个副本,所以他们不再重复?
比方说,我们有一个返回的电子邮件删除,而使用“具有”查询
SELECT email, COUNT(email)
FROM users
GROUP BY email
HAVING (COUNT(email) > 1)
在上述情况下重复下面的SQL查询,如何才能真正删除那些重复的行?或只有一个副本,所以他们不再重复?
一种方法是使用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
假设你的主键是'user',你将如何识别哪个'user'你想删除这两个? – JNevill
[如何删除重复条目?](http://stackoverflow.com/questions/1746213/how-to-delete-duplicate-entries) –