SQL dublicate records

Pagina: 1
Acties:
  • 224 views

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi allemaal,

ik heb hier over het forum zitten kijken heb een aantal topics gevonden maar kom er nog steeds niet uit. hopelijk kunnen jullie helpen.

ik heb een db met 250.000 records opgebouwd als volgt:

tabel naam Contact

Id
Bedrijf
Achternaam
Voornaam
email
Functie
Telefoon op werk
Telefoon thuis
Mobiele telefoon
Faxnummer
Adres
Plaats
Provincie
Postcode
Land/regio
Webpagina
Notities
Bijlagen

nu wil ik de de email adressen filteren omdat er nogal veel dubbele instaan. maar het lukt me niet ze te verwijderen.

plz help met de querie.

thanks

[ Voor 13% gewijzigd door Verwijderd op 02-07-2009 22:53 ]


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Dat noemden ze bij een klant van mij ontdubbelen. Wij hadden het niet zo simpel als jij, dat als een email adres identiek is dat ze dan dubbel zijn, dus wij deden het niet automatisch. Ik denk dat dat bij jou ook niet zo simpel is.

Stel je hebt een query waardoor je alle records per email gegroepeerd hebt (niet sql gegroepeerd, maar gewoon als lijstjes). En je hebt dus 2 of meer records met hetzelfde email adres, wat dan? Gooi je ze allemaal weg behalve degene met het laatste id? Of gooi je die weg met de minste overige data? Of ga je ze mergen en bewaar je alleen het gemergde record? Hoe doe je dat mergen dan?

Hoe ik het zou doen? Wat code schrijven die alle records selecteerd gesorteerd op email en daarna op id.
Dan loop ik over alle records. Als het email verschillend is met de vorige dan sla ik dat record even in een var op. Als het email adres hetzelfde is als het vorige record, dan mark ik het record voor verwijdering. Merge de data van dit record met de vorige en ga verder. Mark het record in de var dat het geupdate moet worden.

Verwijder nu alle records die gemarked zijn voor verwijdering en update alle records die geupdate moeten worden. Plaats een unique constraint op de email kolom.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Macros schreef op donderdag 02 juli 2009 @ 23:02:
Dat noemden ze bij een klant van mij ontdubbelen. Wij hadden het niet zo simpel als jij, dat als een email adres identiek is dat ze dan dubbel zijn, dus wij deden het niet automatisch. Ik denk dat dat bij jou ook niet zo simpel is.

Stel je hebt een query waardoor je alle records per email gegroepeerd hebt (niet sql gegroepeerd, maar gewoon als lijstjes). En je hebt dus 2 of meer records met hetzelfde email adres, wat dan? Gooi je ze allemaal weg behalve degene met het laatste id? Of gooi je die weg met de minste overige data? Of ga je ze mergen en bewaar je alleen het gemergde record? Hoe doe je dat mergen dan?

Hoe ik het zou doen? Wat code schrijven die alle records selecteerd gesorteerd op email en daarna op id.
Dan loop ik over alle records. Als het email verschillend is met de vorige dan sla ik dat record even in een var op. Als het email adres hetzelfde is als het vorige record, dan mark ik het record voor verwijdering. Merge de data van dit record met de vorige en ga verder. Mark het record in de var dat het geupdate moet worden.

Verwijder nu alle records die gemarked zijn voor verwijdering en update alle records die geupdate moeten worden. Plaats een unique constraint op de email kolom.
ok hier snap ik dus de ballen niet meer van.. dit moet toch gewoon mogelijk zijn met 2 queries.. 1 die de records zoekt.. en een andere die ze delete?

ik ben een redelijke noob qua databases maar ik weet toch wel zeker dat het met een query allemaal te ontdubben is.

alleen wil het niet werken zoals ik wil :P

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:49

TeeDee

CQB 241

Verwijderd schreef op donderdag 02 juli 2009 @ 23:09:
[...]
ok hier snap ik dus de ballen niet meer van.. dit moet toch gewoon mogelijk zijn met 2 queries.. 1 die de records zoekt.. en een andere die ze delete?
Als je het zo goed weet... ;)
ik ben een redelijke noob qua databases maar ik weet toch wel zeker dat het met een query allemaal te ontdubben is.
alleen wil het niet werken zoals ik wil :P
Je zal met joins, having, group en count > 1 aan de slag moeten. In principe alle 'lastige' dingen uit de kast halen om het in een zo klein mogelijk aantal queries voor elkaar te krijgen.

Even in m'n archieven gekeken en dit was een query uit een ver, ver verleden.
SQL:
1
2
select [E-mail], Id from table where id  not in 
(select a.id from table a inner join table b on a.[E-mail] = b.[E-mail] and a.id>b.id)

Vziw komen daar wat results uit die je weer in een delete kan gebruiken.

[ Voor 19% gewijzigd door TeeDee op 02-07-2009 23:20 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Welke database gebruik je?

Wat je kunt doen is zoiets:
SQL:
1
2
INSERT INTO temp (SELECT MIN(id) FROM Contact GROUP BY email)
DELETE FROM Contact WHERE id NOT IN (SELECT id FROM temp)

[ Voor 26% gewijzigd door user109731 op 02-07-2009 23:24 ]


Acties:
  • 0 Henk 'm!

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-08 14:24

ZaZ

Tweakers abonnee

dupes zoek ik meestal op een manier als deze
SQL:
1
2
3
4
SELECT   Count(1) AANTAL,
                 FOO NAAM
        FROM     BAR
        GROUP BY NAAM

[ Voor 3% gewijzigd door ZaZ op 02-07-2009 23:25 ]

Lekker op de bank


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
We zijn hier geen helpdesk om jou kant en klare code aan te leveren. We verwachten minsten wat inzet van een TS. Zo verwachten we dat de TS laat zien wat hij allemaal geprobeerd heeft, en wat daar niet aan wilde lukken.

Met de SQL F.A.Q., en dan met name het gedeelte over group by zou je al een heel eind moeten komen ( Programming FAQ - SQL )

Lees ook even De Quickstart en het PRG Beleid door.

[ Voor 13% gewijzigd door Woy op 02-07-2009 23:34 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1

Dit topic is gesloten.