[interbase]delete where count(a,b,c) > 1

Pagina: 1
Acties:

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Ok jongens, ik heb een database van 30.000 records.

Het model is:

id[autoinc][pk]
naamid[k]
datum[k]
tijd[k]
teller
zooi
zooi
zooi

De teller houdt bij hoeveel records er zijn met dezelfde naamid, datum & tijd. Wegens een 'bug' ;) zijn 2.5% v/d records dubbel: dwz: dezelfde naamid,datum,tijd.

Nu wil ik alle records deleten die dezelfde naamid,datum&tijd hebben, EN er meerdere records van zijn, EN dan moet hij de kleinste [teller] verwijderen, dus alleen de grootste overhouden.
Weten jullie een mooie query?

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Delete alles waar het id in (select id's van records die dubbel zijn)

Zoiets?

  • johnny7
  • Registratie: November 2000
  • Laatst online: 07-11-2023
delete from Zooi x where x.id in
(select y.id from Zooi y where y.naamid = x.naamid and y.datum=x.datum and y.tijd= x.tijd and y.teller < x.teller).

Zoiets :?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nielsz: ik had van jou toch wel een duidelijke titel verwacht...

Bedenk even een nieuwe :)

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

Ik neem aan dat het ook de bedoeling is dat eventuele records die naar de records verwijzen die "dubbel" zijn ook worden naar het juiste record dienen te wijzen??
In het laatste geval zou ik het zeker niet met een Query doen maar gewoon lekker in de prog-taal die je gebruikt, of een uitgebreide sp.

:?

If you are not wiping out you are nog pushing enough...


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op vrijdag 04 januari 2002 17:46 schreef Nielsz het volgende:
Weten jullie een mooie query?
Ja die zou ik wel kunnen bedenken, maar als ik het kan, dan kan je dat zelf ook. Talk about code-request.

Met andere woorden, als ik zo onder de douche uitkom en ik ben in een goed humeur, wie weet draai ik wat voor je in elkaar. :P

Vraagje over je ID waarden, die zijn uniek over de hele tabel, of niet?

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ok, ik heb gedouched. En ik ben in een redelijk humeur, jammer genoeg voor jou niet in een goed humeur.

In ieder geval, het makkelijkste kun je dit doen.

Creëer een tabel met exact dezelfde kolom typen als de kolom waar jij alle dubbele gegevens uit wil halen.

Kopieer vervolgens alles middels een query naar die tabel, de query filtert alle dubbelen eruit. (Mits je het goed doet.)

Vervolgens dump je de inhoud van de orginele tabel en kopieer je de waarden uit de tijdelijke tabel terug naar de nieuwe tabel.

Maar er zijn ook zat andere manieren om dit te doen. Probleempje waar je tegen aan zult lopen is voornamelijk de gebrekkige ondersteuning van statische query's.

Edit: Hoe weet je of een regel uniek is (het ID buiten beschouwing gelaten)? Group by loslaten op de kollommen die wel uniek moeten zijn en vervolgens kijken of MAX(ID) gelijk is aan MIN(ID) van elke groep. Wanneer die twee gelijk zijn dan heb je een unieke regel.

Meestal komen dit soort database problemen vanwege een slecht database ontwerp. Waarom zijn die waarden dubbel in het systeem in de eerste plaats? Kon dat niet verhinderd worden bij het invoeren?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Johnny7 >> Die hebben wij idd ook jah.

ACM >> :) Ik was ff snel aan het tikken moest huis, collega zat te kijken enzo, en had het door toen ik op verstuur drukte :)

The - DDD: Geen code request; we hebben zelf al code, (die van Johhny7), maar we weten dus niet of dat voor 100% goed gaat. Wel een goed id idd om ff een kleine table te maken en het daar op te controleren.
En het brakke model: tja (tot voor vanmiddag had ik nog nooit van die db gehoord ;) En die teller bestond omdat er eerst geen mogelijkheid was om autoinc te gebruiken. (dat is best vaag met interbase, moet je SP enzo ervoor gebruiken :D ), daarom dus de teller.

En ik had zelf zo'n query:

delete from table where id = (select min(id) from table where count(naamid,datum,tijd) > 1)

maar
a) count(n,d,t) kan niet ;)
b) zulke sqlquery's werken niet in interbase.

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

als je een auto-inc wilt hebben moet je voor iedere key een unieke generator schrijven en een trigger op de insert zetten. Je kunt dan middels een stukje proggen (sp) unieke sleutels krijgen.

If you are not wiping out you are nog pushing enough...


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

en voor de sleur en pleur gekken :)

http://www.ibexpert.com

Dit programma gebruik ik zelf als ik met interbase aan de slag ga. En je kan inderaad gewoon een trigger hangen aan een veld als je die autoinc. wilt hebben. (Heeft IbExpert zelfs een optie voor).

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op vrijdag 04 januari 2002 22:22 schreef Nielsz het volgende:
Een aantal van de beperlkingen van Interbase kun je omzeilen door views te gebruiken Ook het concaten van resultaat waarden maakt het mogelijk om op de juiste manier group-by toe te passen.
Pagina: 1