Tema: Inner Join
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/11/2007, 22:07
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Inner Join

Bueno, te falta un poco de álgebra relacional.
Los INNER JOIN son excelentes formas de reunir y seleccionar conjuntos de registros entre dos tablas que comparten un campo. Pero hacer un INNER JOIN encadenado entre varias tablas, es un tanto ineficiente, ya que la selecciones se superponen en un cálculo que al motor del SGBD le puede insumir ingentes cantidades de tiempo de procesador... inutilmente.

Para usar un INNER JOIN hay algunas reglas básicas:

1. Se debe realizar sobre tablas acotadas por selecciones previas, esto es, ten en cuenta que lo primero que se intentará hacer es el INNER JOIN, por lo que se hará con TODOS los registros disponibles, incluso los que al final no se usarán. Es mejor realizar un select previo. Los INNER JOIN siempre deben ser la etapa final de las consultas.

2. Dos inner join encadenados se deben realizar por medio de subconsultas, sobre todo para prevenir el cruzamiento de alias (que es lo que te está diciendo el MySQL: estás haciendo dos inner join con una tabla que se comparte entre ambos y sin otorgarle un alias a la segunda). O sea: SELECT X,Y,Z FROM TABLA1 INNER JOIN (SELECT K,J,Z FROM TABLA2 INNER JOIN TABLA3 ON TABLA2.K = TABLA3.K) AS TABLA4 ON TABLA2.Z = TABLA4.Z; De esta forma los encadenamientos de las tabla sderivadas y sus resultados son más claros.

3. Índices declarados sobre los campos compartidos, aceleran el resultado.

4. Si existen índices que contengan toda la información buscada de una tabla (como el de los nombres+apellidos+id_documento), MySQL hará el nner join leyendo el ídice y no la tabla.

5. El uso de subconsultas y alias en tablas y campos permite, dado el caso, que si el nombre del campo de una tabla es diferente del campo relacionado en otra tabla, se puede hacer que al derivarla la tabla resultado tenga los el mismo nombre que el del siguiqnte INNER JOIN y por tanto poder usar el USING.
Además: Si los campos que se comparten de dos tablas tienen el mismo nombre, la sintaxis más eficiente no es usar ON sino USING: SELECT K,J,Z FROM TABLA2 INNER JOIN TABLA3 USING (K); en MySQL es más rápido.

Última edición por gnzsoloyo; 27/11/2007 a las 22:12 Razón: Visualización del texto y claridad de conceptos