SQL - Delete from table wher..

 
Vista:

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 07/05/2013 14:58:50
Buenas estoy tratando de hacer una consulta que pueda eliminar registros que s encuentran repetidos en otra tabla. Explico:


tabla 1: tiene

- codigo, nombre y planilla


tabla 2: tiene
-codigo ,nombre fecha, planilla


El codigo, nombre y planilla son iguales en las tablas


Lo que quiero hacer es eliminar los registros de la tabla 1 donde el tabla1.codigo=tabla2.codigo and tabla1.planilla= tabla 2.planilla. lo que yo hago es esto y no me sale:


delete from tabla1 t1, tabla2 t2
where t1.codigo=t2.codigo and t1.planilla =t2.planilla
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Delete from table wher..

Publicado por leonardo_josue (1173 intervenciones) el 07/05/2013 15:46:34
Hola Juan Carlos...

En primer lugar deberías comenzar por decirnos qué Motor de Base de Datos estás utilizando... aunque todos las BD's tienen sintáxis semejante, también puede haber diferencias importantes entre cada uno de ellos, siempre que publiques un post en este o en cualquier otro foro de consultas especifica la versión/edición del motor que estás utilizando.

Por otro lado, dices que

1
lo que yo hago es esto y no me sale:


Pero no nos dices por qué no funciona la consulta, ¿Te marca algún error de sintaxis? si es así, entonces comienza por decirnos qué error es lo que te marca. ¿La consulta no hace lo que quieres?, entonces explícanos qué es lo que hace. ¿La consulta no marca error pero no hace nada?, entonces coloca algunos datos de tus tablas y dinos qué es lo que debería de hacer.

Entre más detalles pongas de tu problema más sencillo será tratar de ayudarte. Con MySQL podrías hacer algo como esto. Checa este script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> SELECT * FROM tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    4 | cuatro      |
+------+-------------+
2 rows in set (0.00 sec)
 
mysql> DELETE tabla1.* FROM tabla1
    -> INNER JOIN tabla2 ON tabla1.id = tabla2.id AND
    ->                      tabla1.descripcion = tabla2.descripcion;
Query OK, 1 row affected (0.06 sec)
 
mysql> SELECT * FROM tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    2 | dos         |
|    3 | tres        |
+------+-------------+
2 rows in set (0.00 sec)


Observa que sólo el registro id = 1 con descripcion = 'uno' se elimina de la tabla1, pues es el único que aparece duplicado. También podrías intentar utilizar cualquiera de las siguientes formas de eliminación:

1
2
3
4
5
6
7
8
DELETE tabla1.* FROM tabla1, tabla2
WHERE tabla1.id = tabla2.id AND
      tabla1.descripcion = tabla2.descripcion;
 
DELETE FROM tabla1
WHERE EXISTS ( SELECT * FROM tabla2
               WHERE tabla1.id = tabla2.id AND
                     tabla1.descripcion = tabla2.descripcion);


Ambas sentencias funcionan de la misma manera que la primera.

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
1
Comentar

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 07/05/2013 16:24:05
Estimado muchas gracias por tu pronta respuesta el codigo esta excelente, yo aun soy un cachorro y quiero aprender mas cada dia.

Estoy utilizando sql en access y estoy comparando varias tablas.

No se tb como listar los registros de una tabla que sean diferentes que otra tabla.

Es que tengo dos tablas con campos similares y lo que quiero hacer es listar los registros por codigos de usuario que tengo en mi tabla 1 que no se encuentren en la tabla 2 y viceversa.

Si puedes me echas una manito sino de todas maneras estoy muy agradecido contigo, 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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Delete from table wher..

Publicado por leonardo_josue (1173 intervenciones) el 07/05/2013 17:20:00
Hola de nuevo Juan Carlos:

La idea sería igual que con la sentencia DELETE, pero haciendo una UNION:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mysql> SELECT * FROM tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | otro dos    |
|    4 | cuatro      |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT 'tabla1' tabla, tabla1.*
    -> FROM tabla1
    -> WHERE NOT EXISTS (SELECT *
    ->                   FROM tabla2
    ->                   WHERE tabla1.id = tabla2.id AND
    ->                         tabla1.descripcion = tabla2.descripcion)
    -> UNION
    -> SELECT 'tabla2' tabla, tabla2.*
    -> FROM tabla2
    -> WHERE NOT EXISTS (SELECT *
    ->                   FROM tabla1
    ->                   WHERE tabla1.id = tabla2.id AND
    ->                         tabla1.descripcion = tabla2.descripcion);
+--------+------+-------------+
| tabla  | id   | descripcion |
+--------+------+-------------+
| tabla1 |    2 | dos         |
| tabla1 |    3 | tres        |
| tabla2 |    2 | otro dos    |
| tabla2 |    4 | cuatro      |
+--------+------+-------------+
4 rows in set (0.00 sec)


Observa que agregué un atributo TABLA que indica de qué tabla procede cada uno de los registros, en lo particular prefiero utilizar EXISTS pues te permite comparar por más de un campo... así, si hubiera por ejemplo un registro con un mismo id PERO CON UNA DESCRIPCIÓN DISTINTA, compararía por ambos campos, como en el caso del id = 2... observa que este aparece en ambas tablas, pero tienen una descripción distinta ('dos', 'otro dos'), de tal suerte que son registros distintos.

El código es de MySQL, pero es sólo SQL estándar, por lo que no creo que tengas problemas para ejecutarlo en Access, pero de cualquier manera has 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

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 07/05/2013 19:23:17
Estimado muchas gracias me sirvio de mucho.
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

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 09/05/2013 18:07:55
Estimado trato de comparar dos tablas por codigo de empleado. No tiene nada de primary key porque se dupliques elemento en la tabla. Entonces yo hago esto

En Sql

Selecr su.codigo, vn.codigo, su nombre from solousadas su, vacaciones normales vn where su.codigo=vn.codigo
Go

Pero me salen duplicados lo registros. De 40 me salen 1000. Como podria ser para que no se dupliquen. 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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Delete from table wher..

Publicado por leonardo_josue (1173 intervenciones) el 09/05/2013 22:48:07
Hola de nuevo Juan Carlos...

Vayamos por partes. ¿en primer lugar a qué te refieres con que te salen duplicados? antes que nada tendrías que explicarnos cuál es la cardinalidad entre tus tablas, es decir a cada elemento de tu tabla solousadas ¿cuántos elementos le corresponden de tu tabla vacacionesnormales? si la respuesta es 0 o 1 y te está arrojando más registros que los existentes en tu tabla SU, entonces tienes un problema de PRODUCTO CARTESIANO, es decir que no estás especificando todos los campos por los que se relacionan tus tablas. checa este ejemplo...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.01 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    3 | three       |
+------+-------------+
3 rows in set (0.00 sec)


Observa que en las tablas 1 y 2 existen sólo tres registros, pero qué pasa cuando las relacionamos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla1 T1, tabla2 T2;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    1 | one         |
|    3 | tres        |    1 | one         |
|    1 | uno         |    2 | two         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    2 | two         |
|    1 | uno         |    3 | three       |
|    2 | dos         |    3 | three       |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
9 rows in set (0.00 sec)


Observa que el resultado de las tablas son 9 registros, esto es porque no estoy colocando ninguna relación entre las tablas... esto es un producto cartesiano. para evitar esto hay que colocar todos correctamente las relaciones.

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla1 T1, tabla2 T2 WHERE T1.id = T2.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)


Este es un escenario posible. Ahora bien, si la relación entre tus tablas es de 0 a n, es decir, que cada registro de tu tabla1 pueda tener varios registros de tu tabla2 entonces es perfectamente normal que se repitan resultados, pero eso no implica que sean resultados duplicados. Dinos cuál es tu caso, postea algunos datos de ejemplo y con gusto te ayudamos a tratar de resolverlo... y de preferencia, cuando tengas una pregunta nueva abre un nuevo post en lugar de continuar con un post abierto.

Finalmente, te recomiendo que utilices JOIN en lugar de hacer las uniones en el FROM-WHERE:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla1 T1 INNER JOIN tabla2 T2 ON T1.id = T2.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)


El resultado es el mismo, pero es más eficiente de esta manera, además que las consultas quedan más claras y es más fácil darte cuenta de si falta alguna condición de considerar.

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

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 10/05/2013 00:00:36
Gracias nuevamente estimado. Estoy tratando de adptar el campo nombre de mi tabla puesto que no se como eliminar un slash / que separa los apellidos y nombres de un solo campo y quiero eliminar todo esos slash.
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

Delete from table wher..

Publicado por Juan Carlos (7 intervenciones) el 10/05/2013 17:06:39
Ya no es necesario ya lo hice jeje tendre que meterme a un curso de sql xD
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