|
SQL-frågor med enkel/flera tabeller tar bort dubblettposter Enkel tabell distinkt - 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!!
|