Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 14609|Svar: 0

[Tips] SQL Hur man frågar en tabell för att ta bort dubbletter

[Kopiera länk]
Publicerad på 2014-10-09 11:03:04 | | |

SQL-frågor med enkel/flera tabeller tar bort dubblettposter

Enkel tabell distinkt

  1. select distinct 字段 from 表
Kopiera koden

Många röster grupperas efter

Grupp av måste placeras före order by och limit, annars rapporteras ett fel

************************************************************************************

1. Hitta de redundanta dubblettposterna i tabellen, och dubblettposterna bedöms baserat på ett enda fält (peopleId).

Välj * från personer
där peopleId i (välj peopleId från people group efter peopleId som har count(peopleId) > 1)

2. Ta bort de redundanta dubblettposterna i tabellen, och de dubblettposter bedöms baserat på ett enda fält (peopleId), medan endast posterna med minsta rowid lämnas kvar
ta bort från personer
där peopleId i (välj peopleId från people group efter peopleId som har count(peopleId) > 1)
och rowid inte i (välj min(rowid) från people group efter peopleId har count(peopleId)>1)

3. Hitta redundanta dubblettposter (flera fält) i tabellen
Välj * från vitae a
där (a.peopleId,a.seq) i (select peopleId,seq from vitae-grupp av peopleId,seq har räkning(*) > 1)

4. Ta bort de redundanta dubblettposterna (flera fält) i tabellen, så att endast posterna med minsta rowid blir kvar
ta bort från vitae a
där (a.peopleId,a.seq) i (select peopleId,seq from vitae-grupp av peopleId,seq har räkning(*) > 1)
och rowid inte i (välj min(rowid) från vitae-gruppen av peopleId,seq har räkning(*)>1)


5. Hitta redundanta dubblettposter (flera fält) i tabellen, och innehåller inte poster med minst rowid
Välj * från vitae a
där (a.peopleId,a.seq) i (select peopleId,seq from vitae-grupp av peopleId,seq har räkning(*) > 1)
och rowid inte i (välj min(rowid) från vitae-gruppen av peopleId,seq har räkning(*)>1)

(två)
Till exempel
Det finns ett fält "namn" i tabell A,
Och "namn"-värdet kan vara detsamma mellan olika poster,
Nu behöver du fråga efter objekt med dubbletter av "namn"-värden mellan poster i tabellen;
Välj namn, antal(*) från en grupp efter namn som har antal(*) > 1

Om könet också är detsamma, är det följande:
Välj namn, kön, antal(*) från en grupp efter namn, kön har antal(*) > 1

(tre)
Metod 1

deklarera @max heltal@id heltal

deklarera cur_rows markör lokal för ett valt huvudfält, räkning(*) från tabellnamngrupp efter huvudfält med räkning(*) >; 1

Öppna cur_rows

Hämta cur_rows till @id,@max

medan @@fetch_status=0

Börja

välj @max = @max -1

Ställ in radräkning @max

ta bort från tabellnamn där primärfältet = @id

Hämta cur_rows till @id,@max
slut

Stäng cur_rows

Ställ radräkning 0

Metod 2

"Dubblettposter" har två betydelser av dubblettposter: den ena är en helt duplicerad post, det vill säga en post där alla fält är duplicerade, och den andra är en post med dubbletter av nyckelfält, såsom att Namn-fältet är duplicerat, medan andra fält inte nödvändigtvis är duplicerade eller kan ignoreras.

1. För den första typen av repetition är den relativt enkel att lösa och använda

Välj distinkt * från tableName

Du kan få resultatuppsättningen utan dubblettposter.

Om du behöver ta bort dubbletter (behåll 1 duplicerad post) kan du ta bort dem enligt följande

välj distinkt * i #Tmp från tableName

Drop table tableName

välj * i tableName från #Tmp
Droppbord #Tmp

Denna duplicering uppstår på grund av dålig tabelldesign och kan lösas genom att lägga till unika indexkolumner.

2. Denna typ av duplicettproblem kräver vanligtvis att den första posten i den dubblettposten sparas, och operationsmetoden är som följer

Antag att det finns dubblettfält för Namn och Adress, och du behöver få en unik resultatuppsättning för dessa två fält

välj identity(int,1,1) som autoID, * in i #Tmp från tableName

välj min(autoID) som autoID i #Tmp2 från #Tmp grupp efter Name,autoID

Välj * från #Tmp där autoID är (välj autoID från #tmp2)

Det sista valet får resultatuppsättningen Namn och Adress som inte upprepas (men det finns ett extra autoID-fält som kan skrivas i select-klausulen när man faktiskt skriver)

(4)
Förfrågningar dupliceras

Välj * från tabellnamn där ID är (välj id från tabellnamn

Grupp efter ID

med räkning(id) > 1

)

3. Hitta redundanta dubblettposter (flera fält) i tabellen
Välj * från vitae a
där (a.peopleId,a.seq) i (select peopleId,seq from vitae-grupp av peopleId,seq har räkning(*) > 1)

Att köra kommer att orsaka problem, och att skriva och skicka som where(a.peopleId, a.seq) fungerar inte!!






Föregående:SQL skapar lagrade procedurer med parametrar
Nästa:EPUBReader-läsare, ett måste för att öppna EPUB-filer
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com