Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Listar las id de una tabla A que no aparecen en la tabla B

Estas en el tema de Listar las id de una tabla A que no aparecen en la tabla B en el foro de Mysql en Foros del Web. Hola, buenas a todos. La cosa es así, tengo 2 tablas TABLA A (id_tabla_a, nombres) TABLA B (id_tabla_b, id_tabla_a, propiedades) Yo no estoy liado respecto ...
  #1 (permalink)  
Antiguo 09/09/2011, 08:09
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 9 meses
Puntos: 0
Listar las id de una tabla A que no aparecen en la tabla B

Hola, buenas a todos.

La cosa es así, tengo 2 tablas

TABLA A
(id_tabla_a, nombres)

TABLA B
(id_tabla_b, id_tabla_a, propiedades)

Yo no estoy liado respecto lo típico en estas cosas que es conseguir que "nombre" aparezca en la TABLA B. NO.

Yo lo que quiero es una consulta aparte que crearé luego como vista, que me diga:

"Cuales son los id_tabla_a que no he usado aún en TABLA B"

He intentado un montón de consultas, pero todas me repiten los registros y nada.. no lo consigo,

POrfiiiiii ayudaaaaaa
Muchas Gracias
  #2 (permalink)  
Antiguo 09/09/2011, 09:50
jfw
 
Fecha de Ingreso: enero-2009
Mensajes: 117
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Listar las id de una tabla A que no aparecen en la tabla B

prueba:

SELECT ....
FROM tablaA LEFT JOIN tablaB ON tablaA.id_tabla_a=tablaB.id_tabla_a
WHERE tablaB.id_tabla_a is NULL
__________________
Buscador de casas rurales en España
  #3 (permalink)  
Antiguo 09/09/2011, 10:09
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Listar las id de una tabla A que no aparecen en la tabla B

Cita:
Iniciado por jfw Ver Mensaje
prueba:

SELECT ....
FROM tablaA LEFT JOIN tablaB ON tablaA.id_tabla_a=tablaB.id_tabla_a
WHERE tablaB.id_tabla_a is NULL
Muchas gracias jfw, acabo de ver una página web donde explica su misma manera de hacerlo, y luego añaden esta:

SELECT * FROM tblA
WHERE tblA.ID
NOT IN (
SELECT tblB.ID
FROM tblB
WHERE tblA.ID=tblB.ID
)

Que me parece más sencilla que usando LEFT JOIN etc...

Pero quiero agradecerle mucho mucho el ofrecimiento a ayudarme. Le subo un Karma.
GRACIAAAAAAAAAAAAAAAAAAAAAAASSSSSS SI SI SI SIII

----
POr cierto, a quien interesen,funcionan las dos igual de bien.
  #4 (permalink)  
Antiguo 09/09/2011, 11:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Listar las id de una tabla A que no aparecen en la tabla B

Hola SadlyMistaken:

Dependiendo de tu información y cómo tienes administrados tus índices el utilizar una expresión IN puede resultar muy costoso, en lo particular prefiero utilizar las cláusulas EXISTS o NOT EXISTS para hacer este tipo de comparaciones, ya que entre otras ventajas te permite comparar contra varios campos, no solo contra uno, te pongo un ejemplo para tratar de explicarme mejor.

Código MySQL:
Ver original
  1. mysql> CREATE TABLE TablaA (id int, descripcion varchar(10));
  2. Query OK, 0 rows affected (0.16 sec)
  3.  
  4. mysql> INSERT INTO TablaA VALUES (1, 'uno'), (2, 'dos'), (3, 'tres');
  5. Query OK, 3 rows affected (0.08 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> SELECT * FROM TablaA;
  9. +------+-------------+
  10. | id   | descripcion |
  11. +------+-------------+
  12. |    1 | uno         |
  13. |    2 | dos         |
  14. |    3 | tres        |
  15. +------+-------------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> CREATE TABLE TablaB (id int, descripcion varchar(10));
  19. Query OK, 0 rows affected (0.16 sec)
  20.  
  21. mysql> INSERT INTO TablaB VALUES (1, 'uno'), (2, 'otro dos');
  22. Query OK, 2 rows affected (0.03 sec)
  23. Records: 2  Duplicates: 0  Warnings: 0
  24.  
  25. mysql> SELECT * FROM TablaB;
  26. +------+-------------+
  27. | id   | descripcion |
  28. +------+-------------+
  29. |    1 | uno         |
  30. |    2 | otro dos    |
  31. +------+-------------+
  32. 2 rows in set (0.00 sec)
  33.  
  34. mysql> SELECT * FROM TablaA A WHERE NOT EXISTS (
  35.     -> SELECT * FROM TablaB B WHERE A.id = B.id and
  36.     -> A.descripcion = B.descripcion);
  37. +------+-------------+
  38. | id   | descripcion |
  39. +------+-------------+
  40. |    2 | dos         |
  41. |    3 | tres        |
  42. +------+-------------+
  43. 2 rows in set (0.00 sec)

Observa que en la comparación NOT EXISTS estoy utilizando los campos ID y DESCRIPCION para comparar, el ID = 1 existe tanto en la tabla A como en la tabla B, con la misma descripción, por lo tanto no lo muestra en la salida final.

En las tablas A y B existe un id = 2, pero la descripción es diferente, por lo tanto no la elimina del listado. Si solo necesitas comparar por un campo lo puedes hacer perfectamente. Te repito, es cuestión de cómo tienes organizada tu información. En lo particular siempre he visto un mejor performance del servidor con este tipo de consultas. Podrías probar las tres opciones que tienes (utilizando LEFT JOIN, NOT IN y NOT EXISTS) para ver cual de ellas es más eficiente.

Saludos
Leo.
  #5 (permalink)  
Antiguo 09/09/2011, 11:57
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Listar las id de una tabla A que no aparecen en la tabla B

Fantástico leonardo_josue, una mágnifica solución para cuando quiera "Complicar" con más campos la cosa. Muchísimas Gracias.

Eficiente me parecen las tres, por que las tres me dan el resultado que quiero. Pero si es cierto que es más fácil la del NOT EXISTS si quiero añadir más campos a distinguir. Lo dicho, muchas muchas gracias. Le doy Karma a su post tambien.

Saludos.

Etiquetas: select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:07.