SQL - Mostrar los datos de una tabla menos los de otra

   
Vista:

Mostrar los datos de una tabla menos los de otra

Publicado por Sergio (2 intervenciones) el 06/11/2011 07:38:31
Hola Amigos, soy nuevo en esto del SQL y tengo el siguiente problema:

Tengo 2 tablas en una DB

tabla1: contactos
tabla2: removidos

ambas contienen correos y necesito mostrar los correos de la tabla contactos pero sin los repetidos en la tabla removidos, lo que mas se aproxima a lo que necesito es:



El resultado deseado es:

tabla1:
contacto1
contacto2
contacto3
contacto4

tabla2:
contacto1
contacto2

resultado deseado con la query que no e logrado seria:

contacto3
contacto4


Intente esto:

SELECT contactos.email
FROM contactos, removidos
WHERE
contactos.email <> removidos.correo

Pero esto me devuelve mas datos repetidos en vez de quitarlos.

Gracias por su ayuda.
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

Mostrar los datos de una tabla menos los de otra

Publicado por leonardo_josue (877 intervenciones) el 07/11/2011 17:30:28
Hola Sergio:

De la manera en que estás haciendo tu consulta estás realizando un PRODUCTO CARTESIANO, es por eso que se están repitiendo los registros. Tienes varias opciones para hacer la exclusión de los registros, dependiendo de que BD estés utilizando. por ejemplo algunos motores implementan la función EXCEPT o MINUS, pero no todas las BD las tienen implementadas. Es por eso que siempre es importante que en tus post menciones qué motor estás utilizando.

La opción estándar para todos los motores sería utilizar NOT EXISTS, o NOT IN, por un lado, o LEFT JOIN...

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
mysql> create table tabla1 (email varchar(10));
Query OK, 0 rows affected (0.14 sec)
 
mysql> insert into tabla1 values ('contacto1'), ('contacto2'), ('contacto3'),
    -> ('contacto4');
Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0
 
mysql> select * from tabla1;
+-----------+
| email     |
+-----------+
| contacto1 |
| contacto2 |
| contacto3 |
| contacto4 |
+-----------+
4 rows in set (0.00 sec)
 
mysql> create table tabla2 (correo varchar(10));
Query OK, 0 rows affected (0.13 sec)
 
mysql> insert into tabla2 values ('contacto1'), ('contacto2');
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> select * from tabla2;
+-----------+
| correo    |
+-----------+
| contacto1 |
| contacto2 |
+-----------+
2 rows in set (0.01 sec)
 
mysql> #UTILIZANDO NOT EXISTS
mysql> select * from tabla1 where not exists (
    -> select * from tabla2 where tabla1.email = tabla2.correo);
+-----------+
| email     |
+-----------+
| contacto3 |
| contacto4 |
+-----------+
2 rows in set (0.00 sec)
 
mysql> #UTILIZANDO NOT IN
mysql> select * from tabla1 where email not in (select correo from tabla2);
+-----------+
| email     |
+-----------+
| contacto3 |
| contacto4 |
+-----------+
2 rows in set (0.00 sec)
 
mysql> #UTILIZANDO LEFT JOIN
mysql> select tabla1.email from tabla1 left join tabla2 on
    -> tabla1.email = tabla2.correo where tabla2.correo is null;
+-----------+
| email     |
+-----------+
| contacto3 |
| contacto4 |
+-----------+
2 rows in set (0.00 sec)


En lo particular prefiero utilizar NOT EXISTS, pues es mucho más versátil, pero es cuestión que compares los distintos métodos y veas cual te ofrece un mejor rendimiento.

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

Mostrar los datos de una tabla menos los de otra

Publicado por Sergio (2 intervenciones) el 07/11/2011 18:20:53
Gracias Leo por tu ayuda, problema resuelto con tus ejemplos.

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

Mostrar los datos de una tabla menos los de otra

Publicado por Carlos Cuyé cachosistemas@hotmail.com (11 intervenciones) el 07/11/2011 17:40:27
Asumo que ambas tablas tienen un campo Id_Persona mediante el cual detectás qué persona está en ambas tablas:

SELECT
Apellido,
Nombre,
......
......
FROM Contactos && Aquí sólo la tabla de Contactos 'no removidos'
WHERE Id_Persona NOT IN (SELECT DISTINCT Id_Persona FROM Removidos)

Los operadores IN (...) y NOT IN (...) utilizan una subconsulta para verificar qué datos están, o no, en ella. P.E: IN (1, 2, 4) IN (SELECT ....)
DISTINCT pide sólo una aparición de cada Id, es para evitar sobrecarga por lecturas innecesarias.
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