Ver Mensaje Individual
  #5 (permalink)  
Antiguo 08/04/2014, 15:35
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: consulta entre tablas

Hola de nuevo Patriarka:

En lugar de utilizar alguna de las opciones que te puse arriba, elegiste una que es de entrara una barbaridad y la que peor desempeño tiene...

Vayamos por partes:

1. No es recomendable que en el FROM pongas las tablas que intervienen en una consulta separadas por comas (tal como lo haces):

Código:
...
from Factura F, Remito R
...
Esto de entrada está haciendo un PRODUCTO CARTESIANO, ya que en ningún lugar estás poniendo en el WHERE de qué manera están relacionadas estas tablas...

observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | uno         |
  16. |    2 | dos         |
  17. |    4 | cuatro      |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

Ahora bien, si quitas del WHERE la condición que colocaste, tienes algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2;
  2. +------+-------------+------+-------------+
  3. | id   | descripcion | id   | descripcion |
  4. +------+-------------+------+-------------+
  5. |    1 | uno         |    1 | uno         |
  6. |    2 | dos         |    1 | uno         |
  7. |    3 | tres        |    1 | uno         |
  8. |    1 | uno         |    2 | dos         |
  9. |    2 | dos         |    2 | dos         |
  10. |    3 | tres        |    2 | dos         |
  11. |    1 | uno         |    4 | cuatro      |
  12. |    2 | dos         |    4 | cuatro      |
  13. |    3 | tres        |    4 | cuatro      |
  14. +------+-------------+------+-------------+
  15. 9 rows in set (0.00 sec)

Esto es un producto cartesiano... Tu consulta es ineficiente porque antes de evaluar el WHERE interno, se realiza el producto que te menciono... Si te tomaste un tiempo para leer la última liga que te puse, de habrás dado cuenta que la mejor opción es hacerlo con un LEFT JOIN

Cita:
That's why the best way to search for missing values in MySQL is using a LEFT JOIN / IS NULL or NOT IN rather than NOT EXISTS.
En otras palabra, en lugar de tu consulta, lo que podrías hacer es algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> WHERE T2.id IS NULL;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

es decir, de tu tabla1, el id=3 es el único que no existe en tu tabla2... Otra forma sería con el NOT IN:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> WHERE T1.id NOT IN (SELECT T2.id FROM tabla2 T2);
  3. +------+-------------+
  4. | id   | descripcion |
  5. +------+-------------+
  6. |    3 | tres        |
  7. +------+-------------+
  8. 1 row in set (0.00 sec)

Y también con el NOT EXISTS, que aunque es menos eficiente que los dos anteriores:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> WHERE NOT EXISTS ( SELECT T2.id FROM tabla2 T2
  3.     ->                    WHERE T1.id = T2.id);
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

No sé, pero desde mi punto de vista tu consulta no sirve para lo que planteas de inicio, y si funcionara, te puedo apostar mi comida a que cualquiera de las tres consultas que pongo tendría un mejor rendimiento que la que propones.

Saludos
Leo