Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/09/2008, 09:38
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta Para Jurena

Cita:
Iniciado por cmunozp Ver Mensaje
Estimado, tengo dudas de cuando usar select anidados, por ejemplo tengo 3 tablas con productos A Y B, en la tabla A tengo todos los productos, y en la tabla B tengo algunos de esos productos

si deseara conocer que productos son los que faltan en B, generalmente lo hago de la siguiente manera:


select A.idproducto,B.idproducto
from A left join B on A.idproducto=B.idproducto
where B.idproducto is null -- (la idea es preguntar cual es nulo no recuerdo la sintaxis)


esto se podria hacer con un select anidado, seria mas rapido? es mas optimo?

saludos y gracias
amigo cmunozp,



No soy técnico y mis conocimientos no me permiten responderte a lo que preguntas. Te diré que yo usaría el cruce de tablas con left join buscando el null en el campo cuya ausencia buscas. La otra opción con
select t1.campo FROM tabla1 t1 WHERE t1.campo NOT IN (SELECT t2.campo from tabla2 t2)
no sé cómo funcionaría en versiones no muy recientes de MySQL (al parecer, las subconsultas no funcionan con las anteriores a la 4.1). Y creo que es algo más lenta, pero no sabría decirte exactamente por qué, más allá de que siempre es mejor una unión que una subconsulta.

En ambos casos, mejoraría la velocidad la existencia de índices para ese campo.

Espero que entren en el hilo otros con más conocimientos que yo y puedan ayudarnos.

Un saludo, amigo.

Un consejo, cambia el título del post por
LEFT JOIN ... IS NULL versus NOT IN (SELECT...)
o algo así. De ese modo, seguro que nuestros técnicos se animarán a ilustrarnos.

EDITO PARA AÑADIR que he hecho unas pruebas y un explain a los dos tipos de búsquedas sobre unas tablas mías indexadas y el resultado ha sido:
explain SELECT p.id from tabla1 p left join tabla2 pl on p.id = pl.id WHERE pl.id IS NULL
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE p index NULL PRIMARY 4 NULL 5653 Using index
1 SIMPLE pl index NULL IDX_LEXPAL 10 NULL 10536 Using where; Using index
Segundos usados 0.0006 y 0.0009 para encontrar 84

Explain SELECT p.id from tabla1 p where id not in (select pl.id from tabla2 pl)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY p index NULL PRIMARY 4 NULL 5653 Using where; Using index
2 DEPENDENT SUBQUERY pl index NULL IDX_LEXPAL 10 NULL 10536 Using where; Using index
Segundos 0.0006 y 0.0009 para encontrar 84

Los tiempos son muy parecidos, pero en realidad no sé si el parseador cambia la segunda consulta por la primera. Está claro que la única diferencia es la existencia de dependent subquery, una subconsulta dependiente, en la segunda, algo que debería hacer menos eficiente la consulta.

Última edición por jurena; 04/09/2008 a las 14:43