如何删除 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
如您所见,我们可以多次看到名为 Mike
的 Person
有一个 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
);
我有一个 table,其中插入了一些数据。问题是有许多行与其他行相等,我想删除它们,只留下其中一行。例如:
Table 人
name pet
---------------------------
Mike Dog
Kevin Dog
Claudia Cat
Mike Dog
Mike Dog
Kevin Snake
如您所见,我们可以多次看到名为 Mike
的 Person
有一个 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
);