|
Interogările SQL single/multi-table elimină înregistrările duplicate Tabel distinct - select distinct 字段 from 表
Cod de copiere
Multe voturi sunt grupate după Grupul de trebuie plasat înaintea comenzii de și limită, altfel va fi raportată o eroare ************************************************************************************ 1. Găsiți înregistrările duplicate redundante în tabel, iar înregistrările duplicate sunt evaluate pe baza unui singur câmp (peopleId). selectează * din oameni unde peopleId în (selectează peopleId din grupul de persoane după peopleId, având numărătoarea(oamenii) > 1) 2. Ștergeți înregistrările duplicate redundante din tabel, iar înregistrările duplicate sunt evaluate pe baza unui singur câmp (peopleId), lăsând doar înregistrările cu cel mai mic rowid șterge din oameni unde peopleId în (selectează peopleId din grupul de persoane după peopleId, având numărătoarea(oamenii) > 1) și rowid not in (selectează min(rowid) din grupul de persoane după cum se numără (peopleId)>1) 3. Găsirea înregistrărilor duplicate redundante (mai multe câmpuri) în tabel selectează * din vitae a unde (a.peopleId,a.seq) în (selectați peopleId,seq din grupul vitae după peopleId,seq având numărătoare(*) > 1) 4. Șterge înregistrările duplicate redundante (câmpuri multiple) din tabel, lăsând doar înregistrările cu cel mai mic rowid șterge din vitae a unde (a.peopleId,a.seq) în (selectați peopleId,seq din grupul vitae după peopleId,seq având numărătoare(*) > 1) și rowid not in (selectează min(rowid) din grupul vitae după peopleId,seq având count(*)>1) 5. Găsiți înregistrări duplicate redundante (mai multe câmpuri) în tabel și să nu conțină înregistrări cu cel mai mic rowid selectează * din vitae a unde (a.peopleId,a.seq) în (selectați peopleId,seq din grupul vitae după peopleId,seq având numărătoare(*) > 1) și rowid not in (selectează min(rowid) din grupul vitae după peopleId,seq având count(*)>1)
(doi) De exemplu Există un câmp "nume" în tabelul A, Iar valoarea "numelui" poate fi aceeași între diferite înregistrări, Acum trebuie să interoghezi elemente cu valori duplicate de "nume" între înregistrările din tabel; Selectează numele, numărul(*) dintr-un grup după nume care are număr(*) > 1 Dacă și genul este același, este următorul: Selectează numele, sexul, numărul(*) dintr-un grup după nume, sexul care are număr(*) > 1 (trei) Metoda 1 declară @max întreg, @id întreg declarați cur_rows cursor local pentru un câmp principal selectat, count(*) din grupul de nume tabel după câmpul principal având count(*) >; 1 Deschide cur_rows aduce cur_rows în @id.@max în timp ce @@fetch_status=0 Încep select @max = @max -1 setează numărul de rânduri @max șterge din numele tabelului unde câmpul primar = @id aduce cur_rows în @id.@max Sfârșit Aproape cur_rows Set Rowcount 0 Metoda 2 "Înregistrări duplicate" are două sensuri pentru înregistrări duplicate: una este o înregistrare complet duplicată, adică o înregistrare cu toate câmpurile duplicate, iar cealaltă este o înregistrare cu părți duplicate din câmpuri cheie, cum ar fi câmpul Nume este duplicat, în timp ce celelalte câmpuri nu sunt neapărat duplicate sau pot fi ignorate. 1. Pentru primul tip de repetiție, este relativ ușor de rezolvat și folosit select distinct * din tableName Poți obține setul de rezultate fără înregistrări duplicate. Dacă trebuie să ștergi înregistrările duplicate (păstrează o înregistrare duplicată), le poți șterge după cum urmează selectează distinct * în #Tmp din tableName tabel drop tabelNume select * în tabelName din #Tmp Drop Table #Tmp Această duplicare apare din cauza unui design slab al tabelelor și poate fi rezolvată prin adăugarea unor coloane de index unice. 2. Acest tip de problemă duplicată necesită de obicei păstrarea primei înregistrări din înregistrarea duplicată, iar metoda de operare este următoarea Să presupunem că există câmpuri duplicate de Nume și Adresă și ai nevoie să obții un set de rezultate unic pentru aceste două câmpuri select identity(int,1,1) ca autoID, * în #Tmp din tableName select min(autoID) ca autoID în #Tmp2 din grupul #Tmp după Name,autoID select * din #Tmp unde autoID în(select autoID din #tmp2) Ultima selecție primește setul de rezultate Nume și Adresă care nu sunt repetate (dar există un câmp suplimentar autoID, care poate fi scris în clauza select atunci când scrii efectiv) (4) Interogările sunt duplicate selectează * din numele tabelului, unde se identifică (selectează ID din numele-tabelului Grupează după ID având numărătoare(id) > 1 ) 3. Găsirea înregistrărilor duplicate redundante (mai multe câmpuri) în tabel selectează * din vitae a unde (a.peopleId,a.seq) în (selectați peopleId,seq din grupul vitae după peopleId,seq având numărătoare(*) > 1) Alergatul va cauza probleme, iar scrisul și trimiterea de genul unde (a.peopleId, a.seq) nu vor funcționa!!
|