在查询中使用“having”时删除

时间:2016-04-11 20:22:36

标签: sql postgresql

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

EraseMemory:
    str r0, [r1]
    add r1, r1, #4
    add r2, r2, #1
    cmp r2, #64         @ 256 / 4 = 64
    bxeq lr             @ This loop should run 64 times to erase all 256 bytes of memory that were used
    bal EraseMemory

在上面的例子中,我们如何实际删除那些重复的行?或者只有一个重复项,以便它们不再重复?

2 个答案:

答案 0 :(得分:3)

一种方法使用ctid

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

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

答案 1 :(得分:2)

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

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

DELETE FROM CTE WHERE RN > 1