Mõni päev tagasi, kui tegin nõuet, pidin puhastama duplikaatkirjed MySQL-is ja tol ajal oli idee kirjutada need koodi läbimise kaudu, kuid siis tundus see liiga keeruline, arvasin, et peaksin probleemi lahendama SQL-lavastusega. Pärast info kontrollimist ja juhiga konsulteerimist koostasin väga mugava SQL-i avalduse, mida jagan siin ja ideid.
Vajaduste analüüs
Kui andmebaasis on duplikaatkirjeid, kustuta ja hoia üks neist alles (sõltumata sellest, kas duplikaatväljade määramise kriteeriumid on mitu välja).
lahus
Kui kohtad seda vajadust, on sul tõenäoliselt südames idee. Kõige kiirem asi, mis pähe tuli, oli see, et saan selle lahendada SQL-lausega, aga keerulistes SQL-lausetes olin liiga pealiskaudne, nii et tahtsin bossilt abi küsida.
Leia keegi, kes aitaks
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Oma Baidu
Leidsin SQL-i avalduse:
See SQL-idee on ilmne, seal on järgmised 3 sammu:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Küsi duplikaatkirjeid tabelis tingimusena
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Teine tingimus on ID väikseim väärtus duplikaatkirjetes päringutabelis
- Lõpuks, vastavalt eeltoodud kahele tingimusele, kustuta ülejäänud duplikaatkirjed, välja arvatud väikseim ID duplikaatkirjes
Kahjuks on selle lause käivitamisel viga, mis tähendab ligikaudu, et tabelit ei saa uuendada samaaegselt päringuga.
Kood lahendatud
Eelneva SQL-väite põhjal arvan, et võid sama eesmärgi saavutada kahe sammuga koodi abil:
- Duplikaatandmekogumid võetakse esmalt välja
- Päringu alusel eemaldatakse ülejäänud duplikaadid tsüklis
Mul oli idee ja kirjutasin selle kiiresti, aga olin šokeeritud, kui selle käivitasin, ja mul oli seda tegelikult vaja116-dvasakule ja paremale, ning siis tahan leida SQL-lause, mida saaksin kasutada, kleepida kood ja jooksev tulemus:
Täiuslik [duplikeerimine ja jäta üks] SQL
Lõpuks sain tehnilises grupis täiusliku vastuse, vaata seda SQL-i väidet:
Ülaltoodud SQL väide, kui lähemalt vaadata, pole idee mõistmine keeruline ja see on tõenäoliselt jagatud kolmeks sammuks, et aru saada:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1) t2 Küsi duplikaatkirjeid, et moodustada kogu (ajutine tabel t2), mis sisaldab iga duplikaatkirje minimaalset ID-d
- consum_record.user_id = t2.user_id ja consum_record.monetary = t2.monetary ning consum_record.consume_time = t2.consume_time Assotsieerunud väljad duplikaatkriteeriumide jaoks
- Kustuta kirjed, mille ID-d on suuremad kui T2 ID-d, vastavalt tingimustele
Kui ma seda lauset nägin, mõtlesin endamisi, et see on liiga võimas. Selline lihtne sql-lause suudab lahendada nii keeruka probleemi ja asend tõuseb~ See on ka väga kiire käivitada, originaalne kooditsükli täitmine võtab umbes 116 sekundit, aga siin piisab 0,3 sekundist, imeline~
|