Toon posts:

SQL delete duplicates

Pagina: 1
Acties:

Verwijderd

Topicstarter
SELECT [personentotaal zonder werknr].reln, count(*D
FROM [personentotaal zonder werknr]
WHERE ((([personentotaal zonder werknr].reln) In (SELECT [reln] FROM [personentotaal zonder werknr] As Tmp GROUP BY [reln] HAVING Count(*D>1 )));

deze query geeft mij alle records terug die duplicated zijn. Als ik de select in delete verander dan verwijderd hij alle duplicates dus inclusief de ene die origineel is. Hoe wijzig ik hem zo dat hij van alle duplicates er een over laat!!!

Verwijderd

Topicstarter
Niemand

Verwijderd

geduld

  • Fvdlaar
  • Registratie: Oktober 2001
  • Laatst online: 06-08 10:57
Volgens mij moet je de primary key gebruiken om de dubbele entry te identificeren, die kun je dan opgeven aan de delete. Hoe de query er dan precies uit moet zien weet ik zo niet, maar dat lukt wel, denk ik.

Verwijderd

Ik ben wel benieuwd naar de werkende oplossing. "IF not First-of break-group then delete" gaat volgens mij zo niet.

Verwijderd

kan het niet met limit?

DELETE [LOW_PRIORITY] FROM tbl_name
[WHERE where_definition]
[LIMIT rows]

en dan bv limit 2, aantal_records

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11-09 10:38

Killemov

Ik zoek nog een mooi icooi =)

Dit KAN niet. Bij een delete kun je niet onderscheiden wat single of duplicate values zijn. Met een cursor kan het wel. Een workaround is gebruik maken van een tweede tabel, daar de unieke rijen in te zetten, de eerste tabel opschonen en vervolgens de rijen uit de tweede tabel weer in de eerste zetten.

Hey ... maar dan heb je ook wat!


Verwijderd

Misschien werkt dan het volgende ook wel.
Hoef je in iedergeval niet veel code te typen :)
code:
1
create table <table_name> as select distinct(*) from <orginele_table>

orginel tabel droppen en statement nog eens herhalen

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Met oracle zou je het als volgt doen:
code:
1
2
3
4
5
delete from <tabel> a
where a.rowid > (select min(b.rowid)
             from   <tabel> b
             where  b.<velden> = a.<velden>
            );

Who is John Galt?


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ik neem aan dat er in die tabel wel een sleutel waarde is gedefinieerd?

Anders moet je toch is gaan nadenken over je tabel structuur of diegene die dit gemaakt heeft een gigantische schop onder zijn hol gaan geven.

Nu het volgende. Je hebt een resultaat waarin je alle dubbele personen gezelecteerd hebt. DUs stel dat er eentje is met 2 vermeldingen, dan heb je ze er allebij instaan. En zou je botweg hier de delete op gooien dan ben je ze allebij kwijt, en dat wil je niet. Je wil namelijk hebben dat er 1 over blijft.

Nou je kan dus al je dubbele personen uit je tabel selecteren. Wat je daarmee moet doen is van alle dubbelen er eentje uit halen. Dat kan via een subselect en een distinct.
Dus:

"Alle personen die dubbel vermeld staan" - "de distincte person die dubbel vermeld staan"

Je moet dan uiteraard werken met de sleutels van je tabel.

Je hebt dus een vergelijkbaar resultaat als hieronder:
Een sleutel waarde met een waarde en die waarde is gelijk bij meerdere sleutels.

key--waarde
1----1
2----1
3----1
4----2
5----2
6----2

De distinct(waarde) hiervan zou als volgt kunnen zijn:
key--waarde
1----1
4----2

En als je dan zegt alle dubbele vermeldingen behalve diegenen die in dezelfde selectie staan met distinct.

En dan hou je in dit voorbeeld dus dit over:
key--waarde
2----1
3----1
5----2
6----2

  • tomato
  • Registratie: November 1999
  • Niet online
MySQL vindt dat er niets mis is met een "DELETE ... LIMIT 1;" :D

Maar het gaat hier duidelijk niet over MySQL en ik zou het gebruik van die LIMIT in een DELETE (of UPDATE) statement ten zeerste af willen raden ;)

Verwijderd

Op vrijdag 26 oktober 2001 20:43 schreef justmental het volgende:
Met oracle zou je het als volgt doen:
code:
1
2
3
4
5
delete from <tabel> a
where a.rowid > (select min(b.rowid)
             from   <tabel> b
             where  b.<velden> = a.<velden>
            );
Toch moet je oppassen met rowid in Oracle.
Wanneer je bijvoorbeeld records delete, dan komen er weer rowid's vrij. Deze gebruikt Oracle vrolijk weer opnieuw.
Dit probleem hebben we( op een opdracht) al eens gehad.
Pagina: 1