Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 14609|Antwoord: 0

[Tips] SQL Hoe een tabel te bevragen om duplicaten te verwijderen

[Link kopiëren]
Geplaatst op 09-10-2014 11:03:04 | | |

SQL single/multi-table queries verwijderen dubbele records

Enkele tabel onderscheiden

  1. select distinct 字段 from 表
Code kopiëren

Veel stemmen worden gegroepeerd op basis van

groeperen door moet vóór order by en limiet worden geplaatst, anders wordt een fout gemeld

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

1. Zoek de redundante dubbele records in de tabel, en de dubbele records worden beoordeeld op basis van één veld (peopleId).

Selecteer * uit mensen
waar peopleId in (selecteer peopleId uit peoplegroup op peopleId met count(peopleId) > 1)

2. Verwijder de redundante dubbele records in de tabel, en de dubbele records worden beoordeeld op basis van één veld (peopleId), waarbij alleen de records met de kleinste rowid overblijven
verwijderen van mensen
waar peopleId in (selecteer peopleId uit peoplegroup op peopleId met count(peopleId) > 1)
en rowid niet in (selecteer min(rowid) uit people group door peopleId heeft count(peopleId )>1)

3. Zoek redundante dubbele records (meerdere velden) in de tabel
Selecteer * uit vitae a
waarbij (a.peopleId,a.seq) in (selecteer peopleId,seq uit vitae-groep door peopleId,seq met teller(*) > 1)

4. Verwijder de redundante dubbele records (meerdere velden) in de tabel, zodat alleen de records met de kleinste rowid overblijven
verwijderen uit vitae a
waarbij (a.peopleId,a.seq) in (selecteer peopleId,seq uit vitae-groep door peopleId,seq met teller(*) > 1)
en rowid niet in (selecteer min(rowid) uit vitae-groep door peopleId,seq met telling(*)>1)


5. Zoek redundante dubbele records (meerdere velden) in de tabel, en bevat geen records met de minste rowid
Selecteer * uit vitae a
waarbij (a.peopleId,a.seq) in (selecteer peopleId,seq uit vitae-groep door peopleId,seq met teller(*) > 1)
en rowid niet in (selecteer min(rowid) uit vitae-groep door peopleId,seq met telling(*)>1)

(twee)
Bijvoorbeeld
Er is een veld "naam" in tabel A,
En de "naam"-waarde kan hetzelfde zijn tussen verschillende records,
Nu moet je zoeken naar items met dubbele "naam"-waarden tussen records in de tabel;
Selecteer naam, aantal(*) uit een groep op naam met aantal(*) > 1

Als het geslacht ook hetzelfde is, is het als volgt:
Selecteer naam, geslacht, aantal(*) uit een groep op naam, geslacht met aantal(*) > 1

(drie)
Methode 1

declare @max integer,@id integer

Verklaar cur_rows cursor lokaal voor geselecteerd hoofdveld, tellen(*) vanuit tabelnaamgroep per hoofdveld met aantal(*) >; 1

Open cur_rows

Haal cur_rows in @id,@max

terwijl @@fetch_status=0

begin

selecteer @max = @max -1

Stel rijtelling @max

verwijderen uit tabelnaam waar primair veld = @id

Haal cur_rows in @id,@max
einde

Sluit cur_rows

Set Rowcount 0

Methode 2

"Dubbele records" hebben twee betekenissen van dubbele records: de ene is een volledig duplicaat record, dat wil zeggen een record met alle velden gedupliceerd, en de andere is een record met dubbele delen van sleutelvelden, zoals het Naam-veld is gedupliceerd, terwijl andere velden niet noodzakelijkerwijs gedupliceerd zijn of genegeerd kunnen worden.

1. Voor het eerste type herhaling is het relatief eenvoudig op te lossen en te gebruiken

selecteer verschillend * van tableName

Je kunt de resultaatset krijgen zonder dubbele records.

Als je dubbele records moet verwijderen (1 duplicaat record behouden), kun je ze als volgt verwijderen

selecteer distinct * in #Tmp van tableName

droptabel tabelnaam

selecteer * in tableName uit #Tmp
Drop-table #Tmp

Deze duplicatie ontstaat door slecht tabelontwerp en kan worden opgelost door unieke indexkolommen toe te voegen.

2. Dit type duplicaatprobleem vereist meestal dat het eerste record in het duplicaatrecord wordt bewaard, en de bewerkingsmethode is als volgt

Stel dat er dubbele velden van Naam en Adres zijn, en je een unieke resultaatset voor deze twee velden moet krijgen

selecteer identity(int,1,1) als autoID, * in #Tmp vanuit tableName

selecteer min(autoID) als autoID in #Tmp2 uit #Tmp groep op naam en autoID

selecteer * uit #Tmp waar autoID in zit (selecteer autoID uit #tmp2)

De laatste selectie krijgt de resultaatset van Naam en Adres die niet worden herhaald (maar er is een extra autoID-veld, dat in de select-clausule kan worden geschreven bij het daadwerkelijk schrijven)

(4)
Queries worden gedupliceerd

Selecteer * uit tabelnaam waar id in zit (selecteer id uit tabelnaam

Groep op ID

met telling(id) > 1

)

3. Zoek redundante dubbele records (meerdere velden) in de tabel
Selecteer * uit vitae a
waarbij (a.peopleId,a.seq) in (selecteer peopleId,seq uit vitae-groep door peopleId,seq met teller(*) > 1)

Draaien veroorzaakt problemen, en schrijven en verzenden zoals where (a.peopleId, a.seq) werkt niet!!






Vorig:SQL maakt opgeslagen procedures met parameters
Volgend:EPUBReader reader, een must-have voor het openen van EPUB-bestanden
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com