如何删除 SQL 中的 table 中的相等行?

How can I delete equal rows in a table in SQL?

我有一个 table,其中插入了一些数据。问题是有许多行与其他行相等,我想删除它们,只留下其中一行。例如:

Table 人

    name       pet
---------------------------
    Mike       Dog
    Kevin      Dog
    Claudia    Cat
    Mike       Dog
    Mike       Dog
    Kevin      Snake

如您所见,我们可以多次看到名为 MikePerson 有一个 Dog。 但我只想看一次。所以更新此 table 后我想要的输出是:

    name       pet
---------------------------
    Mike       Dog
    Kevin      Dog
    Claudia    Cat
    Kevin      Snake

如何做到这一点?

最简单的方法可能是重新创建 table:

create table temp_t as 
    select distinct name, pet
    from t;

truncate table t;   -- back it up first!

insert into t (name, pet)
    select name, pet
    from temp_t;

create unique index unq_t_name_pet on t(name, pet);

最后一步是防止以后出现这个问题。

您可以使用 exists 执行此操作。在明显没有主键的情况下,可以使用 system column ctid

delete from mytable t
where exists (
    select 1
    from mytable t1
    where t1.name = t.name and t1.pet = t.pet and t1.ctid > t.ctid
);