|
SQL single/multi-table queries verwijderen dubbele records Enkele tabel onderscheiden - 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!!
|