[SQL] Oudste dubbele records verwijderen

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

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Het volgende is mijn situatie:

Ik heb een tabel met id, update_date en update_time.
In deze tabel komen soms dubbele id's voor. Die moeten er uit, maar nu moet met behulp van update_date en update_time de oudsten eruitgehaald worden.

1 id kan soms wel 4 keer voorkomen, dus bij alles wat meer dan 1x voor komt, moeten de oudsten eruit, zodat id uniek is.

Hoe krijg ik dit voor elkaar met SQL, als dit al mogelijk is. Als het echt niet anders kan, mag het ook met PHP.

Het gaat hier trouwens om een Access database. De SQL moet dus geschikt zijn voor Access. Later wordt hij over gezet naar MySQL, vandaar dat het ook in PHP mag (liever niet).

  • DaRealRenzel
  • Registratie: November 2000
  • Laatst online: 12-08 22:45

DaRealRenzel

Overtuigd Dipsomaan

Met Select distinct kun je unieke records vinden. Dus uit de volledige lijst de unieke er uit halen levert de dubbele op. Deze dan sorteren op ID, datum en tijd, en alle ID's -1 verwijderen.

Nu dit ff omschrijven in SQL.

Nothing is a problem once you've debugged the code


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Distinct is niet alle unieke laten zien. Distinct laat van alle dubbele maar 1 exemplaar zien.

Als ik bijvoorbeeld dit heb

id
1
1
1
2
3
3

en ik doe:
select distinct id

dan laat hij
1
2
3
zien...

  • DaRealRenzel
  • Registratie: November 2000
  • Laatst online: 12-08 22:45

DaRealRenzel

Overtuigd Dipsomaan

oeps

ff trug de boekjes in

Nothing is a problem once you've debugged the code


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
DaRealRenzel schreef op 08 oktober 2002 @ 01:32:
Met Select distinct kun je unieke records vinden. Dus uit de volledige lijst de unieke er uit halen levert de dubbele op. Deze dan sorteren op ID, datum en tijd, en alle ID's -1 verwijderen.

Nu dit ff omschrijven in SQL.
Maar bedankt voor een hint. Ik moet natuurlijk sorteren gebruiken. Dan laat hij van alles maar 1 exemplaar zien, maar wel die met de nieuwste datum!

Tenminste, als ik distinct op alleen id kan zetten, inplaats van het hele record en volgens mij gaat dat niet

Verwijderd

Idee:
Maak een nieuwe tabel, en doe een INSERT INTO ... SELECT FROM ...
Met de SELECT query ga je zoeken naar het nieuwste record met een bepaald ID, door te GROUPen op het ID, waarbij je met MAX bepaald welk ID record de meest recente datum heeft. In dat geval heb je de juiste records in de nieuwe tabel.

Succes :)

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Verwijderd schreef op 08 oktober 2002 @ 01:52:
Idee:
Maak een nieuwe tabel, en doe een INSERT INTO ... SELECT FROM ...
Met de SELECT query ga je zoeken naar het nieuwste record met een bepaald ID, door te GROUPen op het ID, waarbij je met MAX bepaald welk ID record de meest recente datum heeft. In dat geval heb je de juiste records in de nieuwe tabel.

Succes :)
En het mooie is, dat ik insert into ... select from ... al eerder heb gedaan. Op die manier kom ik aan die tabel. Kan ik mooi samen voegen dus :P

MAX hoe komt ie er op... Helemaal niet aan gedacht ;)

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Eh, hehe...

Nu het volgende, ik heb die tabel een beetje vereenvoudigd, om het makkelijker uit te leggen. Maar er zit nog een veld bij. En dat veld verschilt per record. Het is dus zo, dat als er twee records hetzelfde id hebben, het extra veld twee verschillende waardes heeft. Als ik max doe, heb ik wel de goeie tijd en datum, maar niet het goede extra veld :(

Nieuwe situatie is dus:
id, naam, update_date, update_time

Als id twee keer voor komt, is bij die twee 'naam' verschillend. Ik moet nu dus de nieuwste naam hebben bij een dubbel voorkomend id.

[ Voor 0% gewijzigd door Fles op 08-10-2002 02:06 . Reden: typo ]


Verwijderd

Ah okay ... dan is een query alleen niet genoeg, en zal je er gewoon een loopje omheen moeten leggen en het programmatisch moeten doen.

1) Selecteer alle records, gesorteerd op ID en datum (aflopend)
2) Loop door alle records, waarbij je de ID onthoudt
3) Als de ID van een nieuw record hetzelfde is als dat van het vorige, delete het vorige record.

Succes :)

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Juistem, dat zal hem zijn :)

Als iemand hem toch in SQL weet, laat het weten. Voor nu zal ik het op deze manier oplossen.

Verwijderd

k. Mijn idee:

maak een view (of query) met daarin de maximale datum/tijd erin. (misschien ff kijken of je zowel op datum en tijd moet gaan filteren) en vooral het ID van dat record

die records gebruik je dan om een insert in een andere tabel te doen waarbij je een select bla from tabel where ID in (select ID from die_vieuw)

nu heb je als het goed is de gegevens die je wilt, kan je evt. nog met een update statement alle andere gegevens in je nieuwe tabel bijvoegen

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Verwijderd schreef op 08 oktober 2002 @ 12:01:
k. Mijn idee:

maak een view (of query) met daarin de maximale datum/tijd erin. (misschien ff kijken of je zowel op datum en tijd moet gaan filteren) en vooral het ID van dat record

die records gebruik je dan om een insert in een andere tabel te doen waarbij je een select bla from tabel where ID in (select ID from die_vieuw)

nu heb je als het goed is de gegevens die je wilt, kan je evt. nog met een update statement alle andere gegevens in je nieuwe tabel bijvoegen
Gaat niet lukken...

Als je MAX(update_date) en MAX(update_time) doet, dan kan het zijn dat die time en die date niet bij elkaar horen.

Bijvoorbeeld als ik een update_date heb van 08-08--2002 met een bijbehorende update_time van 13:54:34
Daarbij, nog een record met update_date van 12-08-2002 met ee bijbehorende update_time van 09:23:19
Dan zal hij dus van beide de hoogste pakken en das niet de bedoeling.

Verwijderd

SELECT Table1.tijd, Table1.datum, [tijd]+[datum] AS tijd_datum
FROM Table1;

werkt perfect in access

weet niet of er lege velden in tijd/datum zitten, die misschien eerst ff fixen

tijd datum tijd_datum
20-2-2002 14:35:25 20-2-2002 14:35:25

[ Voor 0% gewijzigd door Verwijderd op 08-10-2002 13:24 . Reden: resultset erin ]


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Verwijderd schreef op 08 oktober 2002 @ 13:23:
SELECT Table1.tijd, Table1.datum, [tijd]+[datum] AS tijd_datum
FROM Table1;

werkt perfect in access

weet niet of er lege velden in tijd/datum zitten, die misschien eerst ff fixen

tijd datum tijd_datum
20-2-2002 14:35:25 20-2-2002 14:35:25
Toppertje dan!
Ik krijg idd de lijst met alle nieuwste id's
Nu moet ik zelf nog ff uitvogelen hoe ik hem voor elkaar krijg dat al die records opnieuw worden ingevoerd

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
ik heb dus die tabel met de velden: id, name, update_date, update_time

ik kan niet GROUP BY id doen en dan name ook selecteren. Ik geloof dat dit wel kan in MySQL, dan pakt hij gewoon de bijhorende name ook mee. Kan dit niet ook op een maniertje in Access?

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Alles werkt, mooi gemaakt met visual basic, formuliertje erbij :)

Nu moet ik alleen nog weten hoe je kunt controleren of een tabel bestaat.

In MySQL doe je dit:
DROP TABLE IF EXISTS tabelnaam

Maar in Access kan dat dus niet, Enig id of het met iets anders wel kan?
Pagina: 1