sql >> Database teknologi >  >> RDS >> Mysql

Slet dubletter baseret på to kolonner, og behold den række, der har minimumsværdien af ​​en anden kolonne

Du kan bruge denne forespørgsel til at slette alle duplikerede poster og efterlade den tidligste:

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

Opdater

En alternativ løsning, som burde være mere effektiv for virkelig store tabeller, er at oprette en kopi ved at bruge et UNIKT indeks på rækkerne for at forhindre duplikatindsættelse:

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;

Den unikke nøgle er på kombinationen af kunstnernavn og spornavn, og så vil det give kunstnere mulighed for at have forskellige numre og forskellige kunstnere at have det samme spornavn. Fordi SELECT en del af forespørgslen har ORDER BY år, vil den indsætte kombinationen (kunstner,nummer,år) med det laveste år først, og derefter vil andre identiske (kunstner, spor) poster ikke blive indsat på grund af duplikatnøglen.

Demo på rextester




  1. CTE returnerer fejl

  2. Hurtige tips om relationel databasedesign til MySQL

  3. Sådan får du en liste over alle materialiserede visninger i Oracle

  4. SQL:Brug kun stort første bogstav