Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/09/2011, 11:34
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.