Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   borrrar registros repetidos (https://www.clubdelphi.com/foros/showthread.php?t=69017)

calco_hugo 21-07-2010 01:19:36

borrrar registros repetidos
 
ante todo buenas noches, tengo el siguiente problema, tengo una base de datos, con un campo ID y varios mas, el campo ID no es clave principal ni autoincremental, es solo un campo numerico, ej
ID apellido campo2
1 perez a
2 alvarez b
1 smith c
3 calco d

como tendria que hacer para borrar los id repetidos, sin importar cual de los registros me queda, pero si que quede uno, la base de datos de prueba se llama "base", la verdad busque informacion casi todo el dia y la verdad no hay mucho al respecto.
desde ya les agradezco
hugo

Caral 21-07-2010 01:55:58

Hola
Me imagino que hay que hacer una sentencia sql.
De ahi buscar por medio del campo ID.
De ahi hacer un record count para definir si hay mas de uno de ese mismo ID.
De ahi (yo) guardaria la informacion de uno de ellos en unas variable.
De ahi borraria todos y guardaria el que me interese.
Otra forma es recorrer manualmente la tabla y borrarlos uno a uno.
Saludos

calco_hugo 21-07-2010 02:24:56

gracias caral

calco_hugo 21-07-2010 15:21:03

sigo buscando a full con el google y todavia nada
hugo

ElDioni 21-07-2010 18:54:50

Yo creo que podría ser algo así, sino que alguien me corrija, en una tabla que se llama artículos y el campo que podría repetir es Ref

Código SQL [-]
DELETE * FROM articulos WHERE Articulos.ref IN (SELECT DISTINCTROW Articulos.Ref FROM Articulos
WHERE (((Articulos.Ref) In (SELECT [Ref] FROM [Articulos] As Tmp GROUP BY [Ref] HAVING Count(*)>1 )))
ORDER BY Articulos.Ref)

Un saludo.

calco_hugo 21-07-2010 19:37:18

desde ya muchas gracias por contestar, no me funciono,

DELETE * FROM base WHERE base.id IN (SELECT DISTINCTROW base.id FROM base
WHERE (((base.id) In (SELECT [id] FROM [base] As Tmp GROUP BY [id] HAVING Count(*)>1 )))
ORDER BY base.id)

lo adapte a mi base de datos y campos y no funciono, pero desde ya agradezco tu atencion
hugo

ecfisa 21-07-2010 21:19:46

Suponiendo que: Tabla es el nombre de la tabla, Campo_ID el campo clave y CampoX el que puede repetirse, yo haría:
Código SQL [-]
DELETE FROM Tabla A
WHERE Campo_ID > (SELECT min(Campo_ID) FROM Tabla B
WHERE B.CampoX = A.CampoX);

Saludos.

calco_hugo 22-07-2010 00:37:48

me estoy volviendo loco, les comento

DELETE FROM base WHERE base.id IN (SELECT DISTINCTROW base.id FROM base WHERE (((base.id) In (SELECT [id] FROM [base] As Tmp GROUP BY [id] HAVING Count(*)>1 ))) ORDER BY base.id)

esto en access funciono, contra sqlserver (microsoft V7) no funciona, si alquien puede saber algo les encargo
gracias
hugo

calco_hugo 25-07-2010 17:02:21

parece que a nadie se le ocurre algo, que lio para mi, juas
gracias
hugo

Caral 25-07-2010 17:18:06

Hola
En access los corchetes [ ] funcionan en otras BD no.
Tambien pasa lo mismo con el HAVING y el DISTINCTROW.
Tal vez:
Código SQL [-]
DELETE FROM base WHERE base.id IN (SELECT DISTINCT base.id FROM base WHERE (((base.id) In (SELECT id  FROM base As Tmp Where Count(*)>1 GROUP BY [id] ))) ORDER BY base.id)
Saludos

calco_hugo 25-07-2010 19:11:57

no funciono, pero desde ya te agradezco que contestes un domingo
hugo

roman 05-12-2011 22:09:02

Cita:

Empezado por ecfisa (Mensaje 371107)
Suponiendo que: Tabla es el nombre de la tabla, Campo_ID el campo clave y CampoX el que puede repetirse, yo haría:
Código SQL [-]
DELETE FROM Tabla A
WHERE Campo_ID > (SELECT min(Campo_ID) FROM Tabla B
WHERE B.CampoX = A.CampoX);

¡Ah bárbaro! Excelente idea. No me sirvió tal cual, quizá por una limitación de MySQL pero me quedó usando una tabla auxiliar.

// Saludos


La franja horaria es GMT +2. Ahora son las 20:38:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi