Ver Mensaje Individual
  #5 (permalink)  
Antiguo 01/03/2012, 07:53
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Problema combinando tablas

La restricción

per.idprovincia = pro.idprovincia

sirve para relacionar registros de las dos tablas

mientras que las otras dos sirven para seleccionar registros del resultado de la combinación de tablas.



Hasta aqui coincidimos, no?



En el segundo caso el motor tiene muy claro que es lo que tiene que hacer

Combinar por per.idprovincia = pro.idprovincia
y
Selecionar por (pro.provincia = 'LAS PALMAS') OR (pro.idprovincia = 5)



Si?


Mientras que en el primer ejemplo el motor

No sabe que restricción sirve para combinar por lo que hace un producto cartesiano de las dos tablas y

Selecciona por (per.idprovincia = pro.idprovincia) AND
(pro.provincia = 'LAS PALMAS') OR
(pro.idprovincia = 5)


es decir A y B o C

que por precedencia de operadores son todos los registros donde se cumpla A y B por un lado y los que cumplen C (solo C).


Si?


Para que los dos casos sean equivalentes deberías agregar parentesis

select per.idpersona, per.nombre, per.idprovincia, pro.idprovincia, pro.provincia
from personas per, provincias pro
where
(
(per.idprovincia = pro.idprovincia) AND
((pro.provincia = 'LAS PALMAS') OR
(pro.idprovincia = 5))
);

es decir A y (B o C)

los que cumplen A y una de las otras dos (B o C).


Si?


La diferencia entre una sintaxis y la otra es que con JOIN...ON queda mucho mas claro que hace cada cosa con lo que és mucho más facil resolver dudas como esta. Ademas, y quizas lo mas importante, le ahorra al motor hacer un producto cartesiano.

Obviamente si en las restricciones no hubiera ninguna O (OR) no habrias tenido ningun problema... cuando se combinan ANDs y ORs hay que ir con mucho cuidado.

Finalmente la sintaxis JOIN ...ON hoy en dia es la que se considera estandar.

Si no ves algo claro pregunta. Por cierto esto ya funcionaba así en su dia....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 01/03/2012 a las 08:37