SQL - Eliminar repetidos

   
Vista:

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 16/12/2013 20:08:49
Hola a todos...

Tengo registros duplicados y no logro sacar como eliminarlos.

Saludos y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Eliminar repetidos

Publicado por leonardo_josue (880 intervenciones) el 16/12/2013 21:11:39
Hola Cristian...

Siempre es recomendable ser lo más breve posible en tus post's, pero creo que en tu caso exageraste demasiado con la simplicidad de tu mensaje... acláranos algunas cosas:

1. ¿Qué motor de BD estás utilizando? hay muchísimos motores y cada uno de ellos tiene una sintaxis distinta para SQL.
2. ¿A qué te refieres exactamente con "registros duplicados"? en BD un registro está duplicado sí y sólo si TODOS SUS CAMPOS SON EXACTAMENTE IGUALES, no sé si este sea el caso
3. ¿A qué te refieres con "eliminarlos"? por un lado puedes hacer que los registros duplicados NO APAREZCAN EN UNA CONSULTA, sin necesidad de hacer DELETE a la tabla. Si tu propósito es eliminarlos físicamente de la tabla, entonces tendrías que tener cuidado de que la tabla no sea llave foránea de ninguna otra tabla...
4. Te tomaste un tiempo para buscar la respuesta en San Google o en cualquier buscador?... no lo creo, pues si lo hubieras echo seguramente habrías encontrado la respuesta, y si tienes dudas, checa esta liga:

http://lmgtfy.com/?q=c%C3%B3mo+eliminar+registros+duplicados+en+base+de+datos

Básicamente lo que tienes que hacer es utilizar la cláusula DISTINCT para que no aparezcan registros duplicados.

Investiga un poco acerca de esta cláusula, si continuas con problemas responde a lo que te pregunté al inicio, dinos qué es lo que intentaste hacer y con gusto te ayudamos.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 16/12/2013 21:41:19
Hola leonardo... gracias por contestar.

Si basicamente es una tabla donde anteriormente por errores de bloqueos del sistema, cuando el usuario se equivocaba permitia ducplicar un registro cuando era cargado 2 veces.

Lo que quiero hacer es eliminarlos. No hay demasido misterio, registros que solo difieren en su campo id. Ya intente varias formas y no lo pude lograr por eso pregunto.

De todas formas voy a mirar lo que me pasaste

Saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por leonardo_josue (880 intervenciones) el 16/12/2013 23:28:32
Hola de nuevo Cristian.

Tal como te comenté en mi post pasado, un registro que tiene un campo distinto a otro NO SE CONSIDERA REGISTRO DUPLICADO... lo que pretendes hacer puede ser bastante simple (o bastante complicado, según la lógica de negocio que tengas... a ti tal vez que quede muy claro que es lo que quieres hacer, pero a veces resulta algo complicado para nosotros entender tus necesidades reales.

¿Si dos están duplicados, se eliminan los dos, o se deja uno solo de ellos? esto es usualmente lo que se hace en estos casos, pero sólo Dios y Tú saben en estos momentos si esto es lo que quieres...

Tomando lo que tienes en tu post, de que los registros sólo difieren en su campo id, ¿de qué tipo es el campo id? ¿es un numérico?, ¿es un consecutivo?... nuevamente insisto, no nos das muchos detalles de lo que tienes ni pones datos de ejemplo, por lo que es difícil tratar de jugar al adivino... (porque tampoco mencionaste con qué motor de BD estás trabajando como te lo pedí en el primer post)

En MySQL por ejemplo, podrías utilizar una función de agrupación (MAX o MIN) para dejar sólo uno de los id's, agrupando por todos los campos que estén involucrados... sería más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT id, descripcion FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | otro uno |
|    3 | uno         |
|    4 | uno         |
|    5 | otro uno |
|    6 | unos        |
+------+-------------+
5 rows in set (0.00 sec)
 
mysql> SELECT MAX(id), descripcion FROM tabla GROUP BY descripcion;
+---------+-------------+
| MAX(id) | descripcion |
+---------+-------------+
|       4 | uno         |
|       5 | otro uno    |
|       6 | unos        |
+---------+-------------+
3 rows in set (0.00 sec)

Hay muchas formas de hacer la eliminación (por eso te pedia aclarar el punto 1 acerca de los distintos motores)... podrías intentarlo así:

1
DELETE FROM tabla WHERE id NOT IN (aquí pones la consulta donde obtienes los MAX ID's)

Es decir, eliminaría los tres restantes... sin embargo algunos DMBS no te permiten hacer subconsultas sobre la misma tabla de la que vas a eliminar registros, porque sería algo así como cortar la rama sobre la que estás parado.

Otra forma sería crear una tabla temporal con los resultados que te arroja la subconsulta, eliminar la completamente la tabla original y después renombrar la tabla temporal... esto por supuesto no sirve si tu tabla es llave foránea de otras tablas (por eso te pedía que nos aclararas esto en el punto 2)

Si fuera el caso de que tengas que eliminar TODOS LOS REGISTROS DUPLICADOS, sin dejar uno, entonces harías algo distinto:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT id, descripcion
    -> FROM tabla
    -> GROUP BY descripcion
    -> HAVING COUNT(descripcion) = 1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    6 | unos        |
+------+-------------+
1 row in set (0.00 sec)

Es decir, muestra sólo el último registro, que no está "duplicado" con ningún otro.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 17/12/2013 01:54:20
Hola Leo...
Gracias por tu explicacion... evidentemente no me explico bien y si seguramente no he dado detalles, ya que me hiciste reir con tu frase: "sólo Dios y Tú saben en estos momentos si esto es lo que quieres" jajajaja

Es una base de datos de Access que uso desde vb. Es una tabla que almacena pagos. El id es numerico, automatico unico e irrepetible.

Ha habido errores de los usuarios que el sistema no contemplaba entonces tranquilamente un usuario podia ingresar mas de una vez un pago sin filtrar. Como paso eso en un determinado momento, solo quiero que quede uno registro.

Algo mas ??? Fue mas claro ??

Saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por leonardo_josue (880 intervenciones) el 17/12/2013 16:02:16
Hola de nuevo Cristian:

1
Algo mas ??? Fue mas claro ??

Si, una cosa más: ¿probaste alguna de las soluciones que te puse en el post anterior?

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 17/12/2013 17:24:25
Hola Leo...
Si probé y me da error.... operación no valida

1
DELETE FROM pagos WHERE id NOT IN (SELECT MAX(id),apenom,ncuota FROM tabla GROUP BY apenom,ncuota)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por leonardo_josue (880 intervenciones) el 17/12/2013 22:01:21
Hola de nuevo:

No he trabajado con ACCESS, pero el error que tienes es bastante obvio (bueno, no tanto, dado que al parecer no te has dado cuenta de él).

La subconsulta que pones regresa tres campos: MAX(id), apenom, ncuota... pero solo comparas contra uno de ellos, entonces, ¿cómo sabe el DBMS contra cual de los tres campos debe comparar? la respuesta es que no lo sabe...

http://office.microsoft.com/es-mx/access-help/subconsultas-sql-HP001032271.aspx

En estos momentos no tengo Office para poder probar con Access, pero observa qué pasa con MySQL:

Supongamos que tienes estos datos

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT id, descripcion FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | otro uno    |
|    3 | uno         |
|    4 | uno         |
|    5 | otro uno    |
|    6 | unos        |
+------+-------------+
6 rows in set (0.00 sec)

Ahora, si quisiéramos extraer aquellos registros cuya descripción sea 'uno', podríamos hacer esto:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT id, descripcion FROM tabla
    -> WHERE descripcion = 'uno';
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    3 | uno         |
|    4 | uno         |
+------+-------------+
3 rows in set (0.00 sec)

ahora bien, imagina que queremos meter esto como una subconsulta y utilizar el operador IN, si colocamos la subconsulta, como tal, con los dos campos en el SELECT aparece el siguiente errir:

1
2
3
4
5
mysql> SELECT id, descripcion
    -> FROM tabla WHERE id IN (SELECT id, descripcion FROM tabla
    ->                         WHERE descripcion = 'uno');
 
ERROR 1241 (21000): Operand should contain 1 column(s)

Aquí es más clara la explicación, pues te dice que el operando debe contener sólo una columna... la solución por lo tanto es eliminar el campo DESCRIPCION del SELECT:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT id, descripcion
    -> FROM tabla WHERE id IN (SELECT id FROM tabla
    ->                         WHERE descripcion = 'uno');
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    3 | uno         |
|    4 | uno         |
+------+-------------+
3 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 18/12/2013 04:08:57
Hola Leo...

La verdad que no me funciona...

Mi idea era borrar de un plumazo todos los registros repetidos que existan... pero bueno no quiero molestarte mas ya bastante me has ayudado...


Un saludo y muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por omar pc.net.2018@hotmail.com (1 intervención) el 18/12/2013 04:19:36
saludos
usa distinct(campo)

distinct no muestra registros iguales en una consulta

veras que te resultara, es tan sencillo, como tomar un vaso de agua
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 18/12/2013 05:07:20
Hola omar...

Si pero necesito eliminarlos directamente no que me los obvie.... porque estoy usando Crystal report y el "distinct" no funciona en "selectionformula"....

Mi idea era simplemente borrarlos.

Saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

evitar registro doble en base de datos

Publicado por Wellington ponceanomultiservicios@gmail.com (2 intervenciones) el 14/04/2014 13:12:09
COMO IMPEDIR EL REGISTRO DUPLICADO DE ALGÚN CAMPO EN MYSQL

Uno de los problemas más comunes en el desarrollo Web con bases de datos es el relacionado con los registros duplicados. Evitar los registros duplicados es un problema de la máxima importancia, por ejemplo, cuando estamos creando un sistema de identificación de usuarios registrados.

El problema de los registros duplicados se puede solucionar de diferentes formas. Una de ellas la podemos encontrar directamente en MySQL, aplicando la propiedad UNIQUE al campo que no deseamos que admita registros duplicados. Pero esto, por si solo, es un problema, en el sentido que el usuario completa el registro sin saber que su registro no se ha guardado en la base de datos. Así el nuevo usuario podrá intentar validar su cuenta y acceder sin conseguirlo.

La solución que aquí proponemos es una estructura condicional según la cual, se ejecutan consultas a la base de datos antes de guardar el registro, si el registro no esta guardado, informamos de ello.



Aplicando esta lógica, os presento el siguiente código que tiene por función registrar usuarios en una tabla y comprueba que el nombre de usuario sea único y también el e-mail.



Sin más, el código es el siguiente:

<?php

/*
Código fuente desarrollado por UTERRA.COM

Visita mi web

www.uterra.com
*/

include('abre_db.php');

// Configurar las dos lineas siguientes

$nombre = $_POST["nombre"];
$email = $_POST["email"];
$fecha = date("Y-m-d");

// Inicio de validacion

// Fin de la validacion

// Comprobamos si el usuario esta registrado

$nuevo_usuario=mysql_query("select nombre from $tabla where nombre='$nombre'");
if(mysql_num_rows($nuevo_usuario)>0)
{
echo "
<p class='avisos'>El nombre de usuario ya esta registrado</p>
<p class='avisos'><a href='javascript:history.go(-1)' class='clase1'>Volver atrás</a></p>
";
}
// ------------ Si no esta registrado el usuario continua el script
else
{
// ==============================================
// Comprobamos si el email esta registrado

$nuevo_email=mysql_query("select email from $tabla where email='$email'");
if(mysql_num_rows($nuevo_email)>0)
{
echo "
<p class='avisos'>La direccion de e-mail ya esta registrada</p>
<p class='avisos'><a href='javascript:history.go(-1)' class='clase1'>Volver atrás</a></p>
";
}
// ------------ Si no esta registrado el e-mail continua el script
else
{
$result = mysql_db_query("$base_datos","insert into $tabla (nombre,email,fecha) values ('$nombre','$email','$fecha')");

include('cierra_db.php');

// Confirmamos que el registro ha sido insertado con exito

echo "
<p class='avisos'>Registro insertado con exito</p>
<p class='avisos'><a href='javascript:history.go(-1)' class='clase1'>Volver atrás</a></p>
";
}
// ==============================================
}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Julio (1 intervención) el 15/09/2014 18:03:58
Hola aamigo Leo.

Veo que estás super claro en esto del SQL. Mi caso es el siguente:

Por un error del sistema de control de acceso, cuando se pasa la tarjeta por la lectora de Comedor, a veces se duplica el registro en el campo "Field Time". Por ejemplo, 01/09/2014 12:02:06 p.m. Para los reportes del comedor, debo eliminar ese registro duplicado. Estoy usando "distinct" y nada. Te muestro la instrucción para que me digas que puedo hacer. Mi condición es que en ese campo Field Time no existan dobles marcajes y no me los muestre. Gracias.

SELECT
Distinct.Events.[Field Time]
,Events.[Event ID]
,Events.[Logged Time]
,Events.[Card Holder ID]
,Events.[Record Name ID]
,Events.UserNameID
FROM
Events
WHERE
Events.[Record Name ID] = 129
ORDER BY Events.[Event ID]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por alejandro (1 intervención) el 21/04/2016 16:42:27
estoy haciendo lo mismo, lo mejor parece ser hacer una nueva tabla vacia, igual , luego copiar de una tabla a otra
con
INSERT INTO tabla2
SELECT distinct * FROM tabla1
luego borras los datos de tabla1 y copias de nuevo lo de tabla 2 a tabla1,
o si es posible tambien puedes borrar tabla1 y renombrar tabla2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar repetidos

Publicado por Cristian (30 intervenciones) el 22/04/2016 01:35:44
Gracias Alejandro por tu aporte.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar