Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 14609|Răspunde: 0

[Bacșișuri] SQL Cum să interogezi un tabel pentru a elimina duplicatele

[Copiază linkul]
Postat pe 09.10.2014 11:03:04 | | |

Interogările SQL single/multi-table elimină înregistrările duplicate

Tabel distinct

  1. 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!!






Precedent:SQL creează proceduri stocate cu parametri
Următor:Cititorul EPUBReader, un must-have pentru deschiderea fișierelor EPUB
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com