tables sqlserver outer left inner how mysql sql ms-access join nested

mysql - sqlserver - sql join 3 tables



ANINADO INNER JOIN vs INNER JOIN vs DÓNDE: corrección, rendimiento, claridad para un caso particular(no es un problema típico de JOIN vs WHERE) (3)

¡En Sybase también tendrán el mismo plan de ejecución! El optimizador de consultas es lo suficientemente inteligente como para construir el mismo plan de ejecución para todos ellos :)

Podría cambiar internamente la consulta para seleccionar primero la tabla más pequeña y hacer las uniones internas con esa.

Con respecto al uso de la unión interna o la unión anidada (la última), prefiero la primera. Es más legible tener las uniones internas con las conexiones entre tablas y luego, si es necesario, una cláusula donde con las restricciones (en su ejemplo, no tiene estas restricciones).

Estoy estudiando uniones internas y soy un viejo DÓNDE SQL-92 hombre. Me gustaría saber las implicaciones y entender cómo funciona. Así que esto es solo una pregunta teórica sobre las uniones SQL. Es esto...

SELECT * FROM -- Query 1 tbl1 INNER JOIN ( tbl2 INNER JOIN ( tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1 ) ON tbl2.col1 = tbl3.col2 ) ON tbl1.col1 = tbl3.col3

... lo mismo que esto?

SELECT * FROM -- Query 2 tbl3 INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1 INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3

... o esto (no ordenado por resolución lógica)?

SELECT * FROM -- Query 3 tbl3 INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3 INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1

..o esto (el nodo de referencia cambió; vea que hay una tabla a la que se hace referencia antes de que se cite, pero el producto cartesiano debería ser el mismo)

SELECT * FROM -- Query 4 tbl4 INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3 INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2 INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1

..¿o esto?

SELECT * FROM -- Query 5 tbl1,tbl2,tbl3,tbl4 WHERE tbl3.col1 = tbl4.col1 tbl2.col1 = tbl3.col2 tbl1.col1 = tbl3.col3

... desde el punto de vista estético, sintáctico, de mejores prácticas y funcional?

Es una pregunta muy abierta, pero creo que es muy interesante para la comunidad arrojar algo de luz.


Desde el punto de vista de la corrección, son probablemente iguales. Desde el punto de vista del rendimiento, depende del RDBMS (solo puedo hablar para SQL Server, donde todas las variantes producirán el mismo plan de ejecución).


Todos los motores de base de datos con los que he estado trabajando estrechamente (esto es SQL Server , Oracle , PostgreSQL , MySQL , Sybase , SQLite , Informix y Firebird ) lo optimizarán al mismo plan.

Sin embargo, la cuarta consulta no se analizará en todos los motores (no puede hacer referencia a una tabla en una cláusula ON antes de haber sido utilizada en una cláusula JOIN )

MySQL ofrece una cláusula STRAIGHT_JOIN que afecta el orden de unión utilizado en el plan.

En Oracle , hay una sugerencia /*+ ORDERED */ y en SQL Server hay una sugerencia similar FORCE ORDER . Si una consulta utiliza estos consejos, la orden de unión también se verá afectada por el orden del plan.