2016-04-11 37 views
0

比方说,我们有一个返回的电子邮件删除,而使用“具有”查询

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

在上述情况下重复下面的SQL查询,如何才能真正删除那些重复的行?或只有一个副本,所以他们不再重复?

+0

假设你的主键是'user',你将如何识别哪个'user'你想删除这两个? – JNevill

+0

[如何删除重复条目?](http://stackoverflow.com/questions/1746213/how-to-delete-duplicate-entries) –

回答

3

一种方法是使用ctid

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

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

+0

*'从用户删除' – JNevill

+0

@Abelisto。 。 。我不明白它会怎么做。 –

+0

@Abelisto。 。 。这应该删除所有行,但每个电子邮件只有一行。 –

2

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

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

DELETE FROM CTE WHERE RN > 1