[SQL] Dubbele gegevens.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Ik ben a.t.m. bezig met een schoolopdracht, en daarbij moeten we een database ontdubbelen.
Het zijn 2 verschillende oude databases, 1 in Access, 1 in Excel. Ik heb het al zo ver gekregen dat ik ze heb samengevoegd etc. Maar nu moet ik ze dus ontdubbelen...

So far so good. Distinct en andere dingen heb ik me al een beetje over ingelezen. Maar ik kom er nog niet helemaal lekker uit.

Je hebt de volgende velden:
[ID] [Voornaam] [Tussenvoegsel] [Achternaam] [Geb_datum] [Straat] [Nummer] [Postcode] [Woonplaats]

Nu had ik er zelf al over nagedacht om op een combinatie van Achternaam, geb_datum, postcode & huisnummer te gaan filteren.

Nu dacht ik dat je simpel met een SELECT DISTINCT best alles naar een 2e tabel kan moven:
SQL:
1
2
3
SELECT DISTINCT SamenVoeg.Voornaam, SamenVoeg.Tussenvoegsel, SamenVoeg.Achternaam, SamenVoeg.Geb_datum, SamenVoeg.Straat, SamenVoeg.Nummer, SamenVoeg.Postcode, SamenVoeg.Woonplaats
into TijdelijkeTabel
from SamenVoeg;


Hier krijg je alleen dat hij zoekt op dubbele gegevens in ALLE gegevens. Maar ik moet zoals hierboven staat, alleen Achternaam, geb_datum, postcode & huisnr.

Kan natuurlijk die velden uit de select weghalen, maar ik heb geen idee hoe je de overige gegevens dan weer terug krijgt. Ben nog niet zo'n held in SQL.

Het is ook zeker niet de bedoeling dat jullie mijn schoolopdracht gaan maken of query's gaan zitten voorkauwen, maar opweg helpen zou fijn zijn :+. Heb al heel veel op Google rondgezocht, maar daar hebben ze query's als
SQL:
1
2
3
4
5
SELECT email, 
 COUNT(email) AS NumOccurrences
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )


Maar daar zoeken ze weer op 1 veld. En dan nog krijg ik het niet voor elkaar om de andere velden ook nog terug te krijgen (voornaam, tussenvoegsel, straat en woonplaats).

Wie wil mij op weg helpen :P

Acties:
  • 0 Henk 'm!

Verwijderd

Denk je niet een beetje moeilijk?

Als je het resultaat in de database wilt, dan moet je daar alleen de entries uit de spreadsheet in zetten als ze niet al bestaan.

Dus voor elke entry uit de spreadsheet doe je een query op de database: bestaat er al en entry met die naam, geboortedatum, postcode en huisnummer? Zo ja, skip de entry, zo nee, voeg de entry toe.

Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Mm, nu je het zo zegt :+. Ik ga eens even kijken :).

Acties:
  • 0 Henk 'm!

  • Danfoss
  • Registratie: Mei 2000
  • Laatst online: 12:18

Danfoss

Deze ruimte is te koop..

Of je voegt je 'unieke' velden samen, stopt dat in je having clause en joined het resultaat weer terug aan je bron terwijl je het minimum id per 'unieke key' selecteert.

Sys Specs


Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Verwijderd schreef op zondag 27 maart 2011 @ 12:13:
Denk je niet een beetje moeilijk?

Als je het resultaat in de database wilt, dan moet je daar alleen de entries uit de spreadsheet in zetten als ze niet al bestaan.

Dus voor elke entry uit de spreadsheet doe je een query op de database: bestaat er al en entry met die naam, geboortedatum, postcode en huisnummer? Zo ja, skip de entry, zo nee, voeg de entry toe.
Danku! Hiermee ineens op een nieuw idee gekomen om het gewoon via PHP te doen. Elke keer alleen achternaam, gebdatum, huisnummer en postcode zoeken, kijken of ie al in de temp database zit, zo nee: toevoegen in temp, zo ja: niets doen.

Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 11-09 15:48
Of je maakt een Unique constraint aan op je temp tabel die blokkeert dat identieke gegevens meermaals worden weggeschreven. Zo voorkom je ook dat er maar 1 uniek record komt.

Als je ID veld niet uniek is voor beide, zou je deze los een unique constraint moeten geven.

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Het moet niet uniek zijn. Een achternaam mag best vaker voorkomen.. Als de combinatie van achternaam, postcode, huisnummer en geboortedatum maar uniek zijn. ID moest zowiezo weg, aangezien deze van de 2 databases compleet verschilden (ene database was dit een oplopend cijfer, andere database een combinatie van letters en cijfers).

Acties:
  • 0 Henk 'm!

  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 06-09 09:32

Gé Brander

MS SQL Server

Xaero schreef op zondag 27 maart 2011 @ 17:14:
Het moet niet uniek zijn. Een achternaam mag best vaker voorkomen.. Als de combinatie van achternaam, postcode, huisnummer en geboortedatum maar uniek zijn. ID moest zowiezo weg, aangezien deze van de 2 databases compleet verschilden (ene database was dit een oplopend cijfer, andere database een combinatie van letters en cijfers).
Dan zet je toch een constraint op de combinatie van die velden?

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


Acties:
  • 0 Henk 'm!

Verwijderd

Xaero schreef op zondag 27 maart 2011 @ 17:14:
Het moet niet uniek zijn. Een achternaam mag best vaker voorkomen.. Als de combinatie van achternaam, postcode, huisnummer en geboortedatum maar uniek zijn. ID moest zowiezo weg, aangezien deze van de 2 databases compleet verschilden (ene database was dit een oplopend cijfer, andere database een combinatie van letters en cijfers).
En tweemeerlingen dan? :+

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Ik zou het met een unique constraint oplossen, zoals eerder geopperd, en die constraint weer laten vallen als de import klaar is. Dan hoef je zelf niks te checken maar doet je dbms dat voor je. Om het helemaal makkelijk te maken kun je dan een REPLACE INTO of INSERT INTO IGNORE gebruiken, dan heb je PHP verder niet nodig.

edit:
Of achteraf de UNIQUE constraint toevoegen met een ALTER TABLE IGNORE, dat kan ook nog.

[ Voor 13% gewijzigd door drm op 27-03-2011 22:15 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Zelf heb ik een applicatie waarbij er imports (eg. Excel) gedaan kunnen worden op een bestaande database (MySQL).

Ik doe het volgende:
- neem een regel uit de import
- controleer of deze al in de database staat (adhv unieke waarden en combinaties ervan)
* bestaat nog niet -> toevoegen
* bestaat wel -> updaten/overslaan

In mijn geval is dit nodig vanwege alle extra controles die ik moet doen, maar dit is tevens de meest simpele manier om te ontdubbelen.

Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Verwijderd schreef op maandag 28 maart 2011 @ 11:21:
Zelf heb ik een applicatie waarbij er imports (eg. Excel) gedaan kunnen worden op een bestaande database (MySQL).

Ik doe het volgende:
- neem een regel uit de import
- controleer of deze al in de database staat (adhv unieke waarden en combinaties ervan)
* bestaat nog niet -> toevoegen
* bestaat wel -> updaten/overslaan

In mijn geval is dit nodig vanwege alle extra controles die ik moet doen, maar dit is tevens de meest simpele manier om te ontdubbelen.
Heb het nu ook precies zo opgelost. Alleen in plaats van importeren gewoon de dubbele tabel gepakt, en daarvan elke waarde er uit gecheckt. Als hij nog niet bestaad - toevoegen in nieuwe tabel. Als hij al wel bestaad doet ie niks.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Toch ben ik nog steeds erg benieuwd wat je met de opmerking van Nightspirit gaat doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Janoz schreef op maandag 28 maart 2011 @ 11:27:
Toch ben ik nog steeds erg benieuwd wat je met de opmerking van Nightspirit gaat doen.
Als ik zijn startpost bekijk, zie ik dat hij nu op e-mail adres filtert, en hoewel die wel gedeeld kan zijn, is het natuurlijk best acceptabel om te eisen dat een mail adres uniek is per persoon ( Hoewel dat natuurlijk wel problemen op kan leveren als je die eis achteraf pas stelt )

“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.”


Acties:
  • 0 Henk 'm!

  • Xaero
  • Registratie: November 2007
  • Laatst online: 11-09 07:44
Woy schreef op maandag 28 maart 2011 @ 11:41:
[...]

Als ik zijn startpost bekijk, zie ik dat hij nu op e-mail adres filtert, en hoewel die wel gedeeld kan zijn, is het natuurlijk best acceptabel om te eisen dat een mail adres uniek is per persoon ( Hoewel dat natuurlijk wel problemen op kan leveren als je die eis achteraf pas stelt )
E-mailadres was een voorbeeldquery die ik vond op internet.

Maar het is enkel een een schoolopdracht. En had dus ook op school gevraagd of dit uit moet maken. En toen werd er gewoon gezegt dat je deze gegevens alsnog mocht verwijderen.
Pagina: 1