sql >> Databáze >  >> RDS >> PostgreSQL

Jak odstranit duplikáty v tabulce?

Tím zůstane jeden z duplikátů:

delete from join_table
where ctid not in (select min(ctid)
                   from join_table
                   group by id1, id2);

Váš stůl nemá jedinečný identifikátor, který by mohl být použit k "vybrat jednoho přeživšího". To je místo ctid Postgresu přijde vhod, protože jde o interní jedinečný identifikátor pro každý řádek. Pamatujte, že byste nikdy neměli používat ctid pro více než jen jeden výrok. Není to univerzálně jedinečná věc, ale pro běh jednoho příkazu je to v pořádku.

Příklad SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1

Pokud se chcete zbavit všech řádky, které jsou duplicitní:

delete from join_table
where (id1, id2) in (select id1, id2
                     from join_table
                     group by id1, id2
                     having count(*) > 1);

Ani jedno řešení nebude rychlé na velkém stole. Vytvoření nové tabulky bez duplikátů, jak ukázal jjanes, bude mnohem rychlejší, pokud potřebujete značný počet řádků z velké tabulky.



  1. Escapování speciálních znaků v příkazu SQL LIKE pomocí parametrů SQL

  2. Použití proměnné PHP před dotazem MYSQL

  3. Jaká je správná syntaxe pro dělení v SQL

  4. Kde je uložen klíč a hodnota atributu produktu WooCommerce