sql >> Databáze >  >> RDS >> Mysql

Odstraňte duplikáty na základě dvou sloupců a ponechte řádek, který má minimální hodnotu jiného sloupce

Tento dotaz můžete použít k odstranění všech duplicitních záznamů a ponechat ten nejstarší:

DELETE d
FROM discog d
JOIN discog d1 ON d1.artist = d.artist AND d1.track = d.track AND d1.year < d.year;

Aktualizovat

Alternativní řešení, které by mělo být efektivnější pro opravdu velké tabulky, je vytvořit kopii pomocí UNIQUE indexu na řádcích, aby se zabránilo duplicitnímu vkládání:

CREATE TABLE discog_copy (id INT, artist VARCHAR(50), track VARCHAR(50), year INT);
ALTER TABLE discog_copy ADD UNIQUE KEY (artist, track);
INSERT IGNORE INTO discog_copy SELECT * FROM discog ORDER BY year;

Jedinečný klíč je na kombinaci jména interpreta a názvu skladby, a tak to umožní umělcům mít různé skladby a různí umělci mít stejný název skladby. Protože SELECT část dotazu má ORDER BY rok, nejprve vloží kombinaci (interpret, skladba, rok) s nejnižším rokem a poté se další identické záznamy (interpret, skladba) nevloží kvůli duplicitnímu klíči.

Ukázka na rextesteru




  1. ROUND(datum) Funkce v Oracle

  2. Jak přidat omezení NOT NULL v MySQL

  3. Jak se vypořádat s názvy sloupců SQL, které vypadají jako klíčová slova SQL?

  4. ojdbc14.jar vs. ojdbc6.jar