SQL - 删除重复行而不保留原始行

SQL - Deleting duplicate rows without leaving original

如何根据 select 列删除重复行而不保留原始行?在本例中,根据 Name 和 Animal 进行删除。

ID   Name   Animal   Fruit
1    Bob    Dog      Orange   
2    Adam   Dog      Orange
3    Bob    Dog      Apple
4    Adam   Cat      Orange  
5    Bob    Cat      Apple
6    Bob    Hamster  Apple
7    Adam   Cat      Apple

所以预期的结果是:

ID   Name   Animal   Fruit  
2    Adam   Dog      Orange 
5    Bob    Cat      Apple
6    Bob    Hamster  Apple

试试这个: 首先,select 子查询中的重复项。 然后,删除所有结果

delete from mytable T 
left join 
(select count(*) cnt, Name, Animal 
from mytable 
group by Name, Animal) X 
on t.Name = X.Name 
and t.Animal = X.Animal
where cnt>1

您可以使用 delete 和 join 按名称和动物数量 > 1 分组的子查询

     delete m 
     from my_table m 
     inner join (

        select name, animal
        from my_table
        group by name, animal
        having count(*) > 1 

     ) t on t.name = m.name
        and t.animal  = m.animal

我会使用 exists:

delete from t
    where exists (select 1
                  from t t2
                  where t2.name = t.name and t2.animal = t.animal and t2.id <> t.id
                 );