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

Consulta Para Jurena

Estas en el tema de Consulta Para Jurena en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/09/2008, 08:34
 
Fecha de Ingreso: abril-2001
Mensajes: 293
Antigüedad: 23 años
Puntos: 0
Consulta Para Jurena

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
  #2 (permalink)  
Antiguo 03/09/2008, 09:38
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
  #3 (permalink)  
Antiguo 04/09/2008, 07:09
 
Fecha de Ingreso: abril-2001
Mensajes: 293
Antigüedad: 23 años
Puntos: 0
LEFT JOIN ... IS NULL versus NOT IN (SELECT...)

Ok, muchas gracias por tu respuesta Jurena. tenia la duda de si lo que estaba realizando era optimo o no, la unica duda que me queda es cuando usar los select anidados o mejor dicho cuando es mejor, me imagino que siempre realizar solo una consulta es mejor que hacer dos.


saludos y gracias
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 07:23.