Toon posts:

[SQL]dubbelen verwijderen

Pagina: 1
Acties:
  • 254 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een tabel met 368 records.
Doe ik:
SELECT DISTINCT nummer FROM mensen
krijg ik 364 records als antwoord.
De colom bevat dus 3 dubbele records. Dat wist ik al, ik weet alleen niet welke.
Dus ik doe:
SELECT * FROM mensen WHERE nummer NOT IN (SELECT DISTINCT nummer FROM mensen)
Ik had verwacht nu de drie dubbele te krijgen, maar ik krijg gewoon niks.

Ik heb nog wat rond gezocht of hier nooit iemand een andere oplossing had, maar helaas niks gevonden.

Het rare is dat wanneer ik
SELECT * FROM mensen WHERE nummer NOT IN (1001,1002)
doe, is dat ik dan alles krijg, behalve die nummers. Dus geen idee waarom het dan niet met die bovenste constructie wil lukken.

't betreft MS Access

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
2
SELECT * FROM Mensen WHERE Nummer 
IN (SELECT NUMMER FROM Mensen GROUP BY Nummer HAVING COUNT(Nummer) > 1 )


Dit gaat ervan uit de nummer dubbel is.

DISTINCT geeft gewoon 1 van elke record dat meerdere keren voorkomt, hij laat niet records die meerder keren voorkomen helemaal weg.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

SQL:
1
2
3
SELECT nummer, count(anderekolom) AS whatever FROM mensen
GROUP BY nummer
HAVING whatever > 1;

edit:
bah ik ben langzaam :D

[ Voor 15% gewijzigd door curry684 op 12-09-2004 17:18 ]

Professionele website nodig?


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

De set (SELECT DISTINCT nummer FROM mensen) bevat alle nummers. Dus er zijn geen nummers die niet in die set zitten ;)

Probeer anders:
code:
1
2
SELECT * FROM mensen WHERE nummer IN
(SELECT nummer FROM mensen HAVING COUNT(*)>1 GROUP BY nummer)


Zoiets :?
[/geenzinomhardnatedenken]


Spuit 3425 7(8)7

[ Voor 5% gewijzigd door kenneth op 12-09-2004 17:20 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Thnx, moet toegeven dat het er logisch uit ziet. Ik zat maar op dat distinct te hangen, had de distinct niet helemaal goed begrepen.
Gelukkig zijn er mensen wakkerder dan ik op zondag [/slap excuus :)]

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 12 september 2004 @ 17:27:
Thnx, moet toegeven dat het er logisch uit ziet. Ik zat maar op dat distinct te hangen, had de distinct niet helemaal goed begrepen.
Gelukkig zijn er mensen wakkerder dan ik op zondag [/slap excuus :)]
Welke heb je nu op welke manier gebruikt dan :)

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 12 september 2004 @ 17:50:
[...]

Welke heb je nu op welke manier gebruikt dan :)
De eerste de beste, dus die van P_de_B.
Die van jou werkt trouwens niet. Ik probeerde hem nu, maar dan vraagt ie wat whatever is.
en die van kenneth was ook nog niet geheel zonder fouten :)
Maar het idee is duidelijk

[ Voor 14% gewijzigd door Verwijderd op 12-09-2004 18:10 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

:X

:D

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Ehm..right. :P

Je had GROUP BY en HAVING verwisseld volgens mij. :P


En dat die van curry niet werkt ben ik in het verleden ook tegengekomen. Als je zijn query vervangt door dit werkt het waarschijnlijk ook:
code:
1
2
3
SELECT nummer AS n, (SELECT count(anderekolom) FROM mensen WHERE nummer = n) AS whatever FROM mensen
GROUP BY n
HAVING whatever > 1;

Natuurlijk is dat een stuk ranziger dan die van P_de_B. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Hij is nog steeds niet zo gelukkig met die n.
Zou je de query trouwens ook kunnen schrijven dat hij zoekt naar dubbele combinaties?
Dus bijvoorbeeld alle records waar zowel de voornaam als de achternaam hetzelfde zijn.

Het lukte me bijvoorbeeld net wel om en alle dubbele voornamen en alle dubbele achternamen te krijgen, maar niet met de combinatie erin gebakken, dus alle records waar zowel voor- als achternaam hetzelfde zijn.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Access is gewoon braque, * curry684 duikt weer lekker terug in SQL Server ;)

Professionele website nodig?


  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
select a.naam, b.naam
from namen a, namen b
where a.voornaam = b.voornaam and a.naam = b.naam

?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik denk dat je in access geen aliassen kunt gebruiken voor group by en having clausules, alleen bij order by clausules.

Voor de rest begrijp ik nu niet meer wat je wilt?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
curry684 schreef op 12 september 2004 @ 18:26:
Access is gewoon braque, * curry684 duikt weer lekker terug in SQL Server ;)
Volgens mij accepteert SQL Server ook geen aliassen in de GROUP BY Clausule

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

:? in access zit toch standaard een "find duplicates query"

waarom moeilijk doen als het ook makelijk kan :9

Verwijderd

Topicstarter
komakeef schreef op 12 september 2004 @ 18:27:
select a.naam, b.naam
from namen a, namen b
where a.voornaam = b.voornaam and a.naam = b.naam

?
Stoer, ik wist helemaal niet dat je iets dergelijks kon doen.

@ P_de_B: Ik ben dus nu nog even verder aan het kloten.
Als ik heb:
Peter Vries
Peter Vries
Carla Vries
Carla de Jong
Emma de Jong
Emma de Jong
Peter Langen

Wil ik eigenlijk Peter Vries en Emma de Jong eruit pakken. Maar nu krijg ik Carla ook mee. Dus ik probeer nu een query te brouwen die dubbele achternamen en dubbele voornamen herkent, maar alleen die retourneert waarbij zowel de voor- als de achternaam hetzelfde is.

Het eerste is dus gelukt (m.a.w. de query van P_de_B deed het em).

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
2
3
4
SELECT Voornaam, Achternaam 
FROM Mensen
GROUP BY Voornaam, Achternaam
HAVING COUNT (*) > 1

Oops! Google Chrome could not find www.rijks%20museum.nl


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

code:
1
2
3
select a.naam, b.naam
from namen a, namen b
where CONCAT(a.voornaam, a.naam) = CONCAT(b.voornaam, b.naam)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
P_de_B schreef op 12 september 2004 @ 18:54:
code:
1
2
3
4
SELECT Voornaam, Achternaam 
FROM Mensen
GROUP BY Voornaam, Achternaam
HAVING COUNT (*) > 1
Thnx, dat ziet er zoveel simpeler uit dan waar ik meer bezig was en het werkt nog ook 8)7

[ Voor 4% gewijzigd door Verwijderd op 12-09-2004 18:58 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
NMe84 schreef op 12 september 2004 @ 18:57:
code:
1
2
3
select a.naam, b.naam
from namen a, namen b
where CONCAT(a.voornaam, a.naam) = CONCAT(b.voornaam, b.naam)
Ik denk niet dat CONCAT door Access herkend zal worden.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
^^ nee, CONCAT is voor Access net zo onbekend als voor mij
NMe84 schreef op 12 september 2004 @ 18:57:
code:
1
2
3
select a.naam, b.naam
from namen a, namen b
where CONCAT(a.voornaam, a.naam) = CONCAT(b.voornaam, b.naam)
Zoiets was ik aan het proberen (maar dan zonder Concat), maar had het nog niet helemaal voor elkaar

[ Voor 13% gewijzigd door Verwijderd op 12-09-2004 19:01 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

P_de_B schreef op 12 september 2004 @ 19:00:
Ik denk niet dat CONCAT door Access herkend zal worden.
De || operator zeker ook niet dan? Wat een dom DMBS is het toch ook. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 04-04 23:16
even een hypothese die hier misschien wel op zijn plaats is:

Wij hebben het wel eens gehad dat er om een onduidelijke reden de primary key van de tabel was verwijderd. Vraag me niet hoe en waarom.

Ik wil graag alle dubbele records verwijderen, maar er eentje behouden, zodat er iig een record overblijft.

Heeft iemand hier een oplossing voor. Het heeft mij al heel wat hoofdbrekens gekost. In SQL Server heb ik uiteindelijk volgend stappenplan gevolgd:
• Maak een tijdelijke tabel aan met dezelfde definitie inclusief key.
• Kopieer alle records 1 voor 1 met een cursor als deze nog niet in de tijdelijke tabel staat.
• Verwijder de originele tabel
• Kopieer de tijdelijke tabel naar de originele tabel.

Maar het moet volgens mij ook lukken om alleen de dubbelen te verwijderen om vervolgens de sleutel te zetten.

Problem Exists Between Chair And Keyboard


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Ik snap je vraag niet helemaal, je bent dus de primary key kwijt en die wil je een nieuwe aanmaken, en onderwijl dubbele records verwijderen?

Professionele website nodig?


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Dubbelen verwijderen zonder sleutel is lastig, maar mét is simpel. De dubbelen kan je vinden op (ongeveer) deze manier:
code:
1
2
3
4
5
SELECT A.ID, B.ID 
FROM MijnTabel AS A, MijnTabel AS B
WHERE (A.ID < B.ID) AND
  (A.EenVeld = B.EenVeld) AND
  (B.ID <> Null)


Je krijgt nu alleen de overbodige records terug. In de bovenstaande oplossingen krijg je de dubbelen steeds of dubbel of enkel, maar dan zonder ID terug. Beiden is niet handig als je de dubbele records wil opschonen. Uiteraard kan je in bovenstaande voorbeeld de voorwaarde A.Eenveld = B.Eenveld zo ver uitbreiden als je wil, afhankelijk van wat je definieert als "dubbel".

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
majornono schreef op 13 september 2004 @ 15:56:
even een hypothese die hier misschien wel op zijn plaats is:

Wij hebben het wel eens gehad dat er om een onduidelijke reden de primary key van de tabel was verwijderd. Vraag me niet hoe en waarom.

Ik wil graag alle dubbele records verwijderen, maar er eentje behouden, zodat er iig een record overblijft.

Heeft iemand hier een oplossing voor. Het heeft mij al heel wat hoofdbrekens gekost. In SQL Server heb ik uiteindelijk volgend stappenplan gevolgd:
• Maak een tijdelijke tabel aan met dezelfde definitie inclusief key.
• Kopieer alle records 1 voor 1 met een cursor als deze nog niet in de tijdelijke tabel staat.
• Verwijder de originele tabel
• Kopieer de tijdelijke tabel naar de originele tabel.

Maar het moet volgens mij ook lukken om alleen de dubbelen te verwijderen om vervolgens de sleutel te zetten.
Dat kan toch veel eenvoudiger?

code:
1
2
3
SELECT DISTINCT * INTO NieuweTabel FROM OudeTabel
DROP OudeTabel
SELECT * INTO OuderTabel FROM NieuweTabel


Het enige dat je moet doen is de constraints / keys en indexen opnieuw aanmaken. Dit kun je eenvoudig doen door het script van de oude tabel even te bewaren voor je hem dropt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • majornono
  • Registratie: Juni 2002
  • Laatst online: 04-04 23:16
curry684 schreef op 13 september 2004 @ 16:06:
Ik snap je vraag niet helemaal, je bent dus de primary key kwijt en die wil je een nieuwe aanmaken, en onderwijl dubbele records verwijderen?
Door het ontbreken van de primary key zijn er dubbele records in de database gekomen.
Voorbeeld: Op onderstaande tabel zat een sleutel op ID. Deze is nu verwijderd. Ik wil de sleutel er weer op zetten, maar dat gaat alleen als ik minimaal 1 record met ID=1 verwijder. Maar ik wil ook 1 record behouden, omdat ik anders data verlies.

IDdata
1lorem ipsum...
1lorem ipsum...


@P_de_B: Je hebt gelijk, ik denk te moeilijk 8)7. Maar het is nog steeds vreemd dat het niet zonder een tijdelijke tabel kan

[ Voor 9% gewijzigd door majornono op 13-09-2004 16:33 ]

Problem Exists Between Chair And Keyboard

Pagina: 1