|
SQL enkelt-/multitabellsspørringer fjerner dupliserte poster Enkelt tabell distinkt - select distinct 字段 from 表
Kopier koden
Mange stemmer grupperes etter gruppe by må plasseres før bestilling av og grense, ellers vil en feil bli rapportert ************************************************************************************ 1. Finn de redundante duplikatpostene i tabellen, og duplikatpostene vurderes basert på ett enkelt felt (peopleId). Velg * fra personer hvor peopleId i (velg peopleId fra people group etter peopleId som teller(peopleId) > 1) 2. Slett de overflødige dupliserte postene i tabellen, og duplikatpostene vurderes basert på ett enkelt felt (peopleId), slik at kun postene med minste rowid blir igjen Slett fra folk hvor peopleId i (velg peopleId fra people group etter peopleId som teller(peopleId) > 1) og rowid ikke i (velg min(rowid) fra people group etter peopleId har count(peopleId )>1) 3. Finn redundante duplikatposter (flere felt) i tabellen velg * fra vitae a hvor (a.peopleId,a.seq) i (velg peopleId,seq fra vitae-gruppe etter peopleId,seq med tell(*) > 1) 4. Slett de overflødige dupliserte postene (flere felt) i tabellen, slik at kun postene med minste rowid blir igjen Slett fra Vitae A hvor (a.peopleId,a.seq) i (velg peopleId,seq fra vitae-gruppe etter peopleId,seq med tell(*) > 1) og rowid ikke i (velg min(rowid) fra vitae-gruppen av peopleId,seq har tell(*)>1) 5. Finn redundante duplikatposter (flere felt) i tabellen, og inneholder ikke poster med minst rowid velg * fra vitae a hvor (a.peopleId,a.seq) i (velg peopleId,seq fra vitae-gruppe etter peopleId,seq med tell(*) > 1) og rowid ikke i (velg min(rowid) fra vitae-gruppen av peopleId,seq har tell(*)>1)
(to) For eksempel Det finnes et felt "navn" i tabell A, Og "navn"-verdien kan være den samme mellom ulike poster, Nå må du søke etter elementer med dupliserte "navn"-verdier mellom poster i tabellen; Velg navn, antall(*) fra en gruppe etter navn som har antall(*) > 1 Hvis kjønnet også er det samme, er det som følger: Velg navn, kjønn, antall(*) fra en gruppe etter navn, kjønn som teller(*) > 1 (tre) Metode 1 erklære @max heltall,@id heltall erklære cur_rows markør lokal for utvalgt hovedfelt, tell(*) fra tabellnavngruppe etter hovedfelt med tell(*) >; 1 Åpne cur_rows Hent cur_rows til @id,@max mens @@fetch_status=0 Begynn velg @max = @max -1 Sett radtelling @max Slett fra tabellnavn hvor primærfelt = @id Hent cur_rows til @id,@max slutt Lukk cur_rows Sett radtelling 0 Metode 2 "Dupliserte poster" har to betydninger av dupliserte poster, den ene er en fullstendig duplisert post, det vil si en post med alle felt duplisert, og den andre er en post med dupliserte deler av nøkkelfelt, slik at Navn-feltet er duplisert, mens andre felt ikke nødvendigvis er dupliserte eller kan ignoreres. 1. For den første typen repetisjon er den relativt enkel å løse og bruke velg forskjellig * fra tableName Du kan få resultatsettet uten dupliserte poster. Hvis du trenger å slette dupliserte poster (beholde 1 duplikatpost), kan du slette dem som følger velg distinkt * i #Tmp fra tableName dropptabell Navn velg * inn i tableName fra #Tmp Droppbord #Tmp Denne dupliseringen oppstår på grunn av dårlig tabelldesign og kan løses ved å legge til unike indekskolonner. 2. Denne typen duplikatproblem krever vanligvis at den første posten i duplikatposten beholdes, og operasjonsmetoden er som følger Anta at det finnes duplikatfelt med Navn og Adresse, og du må få et unikt resultatsett for disse to feltene velg identity(int,1,1) som autoID, * inn i #Tmp fra tableName velg min(autoID) som autoID i #Tmp2 fra #Tmp gruppe etter Name,autoID velg * fra #Tmp der autoID er (velg autoID fra #tmp2) Den siste selecten får resultatsettet Navn og Adresse som ikke gjentas (men det finnes et ekstra autoID-felt, som kan skrives i select-klausulen når man faktisk skriver) (4) Forespørsler er dupliserte Velg * fra tabellnavn hvor id er i (velg id fra tabellnavn Grupper etter ID med telling(id) > 1 ) 3. Finn redundante duplikatposter (flere felt) i tabellen velg * fra vitae a hvor (a.peopleId,a.seq) i (velg peopleId,seq fra vitae-gruppe etter peopleId,seq med tell(*) > 1) Å kjøre vil skape problemer, og å skrive og sende som where (a.peopleId, a.seq) vil ikke fungere!!
|