La sintaxis anterior, con solo enumerar las tablas y usar la WHERE
cláusula para especificar los criterios de unión, está en desuso en la mayoría de las bases de datos modernas.
No es solo para mostrar, la sintaxis anterior tiene la posibilidad de ser ambigua cuando se usan tanto INNER como OUTER en la misma consulta.
Dejame darte un ejemplo.
Supongamos que tiene 3 tablas en su sistema:
Company
Department
Employee
Cada tabla contiene numerosas filas, unidas entre sí. Tienes múltiples compañías, y cada compañía puede tener múltiples departamentos, y cada departamento puede tener múltiples empleados.
Ok, ahora quieres hacer lo siguiente:
Enumere todas las empresas e incluya todos sus departamentos y todos sus empleados. Tenga en cuenta que algunas empresas aún no tienen departamentos, pero asegúrese de incluirlos también. Asegúrese de recuperar solo los departamentos que tienen empleados, pero siempre enumere todas las empresas.
Entonces haces esto:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Tenga en cuenta que el último es una unión interna, para cumplir con los criterios de que solo desea departamentos con personas.
Ok, entonces que pasa ahora. Bueno, el problema es que depende del motor de la base de datos, el optimizador de consultas, los índices y las estadísticas de la tabla. Dejame explicar.
Si el optimizador de consultas determina que la forma de hacerlo es primero tomar una empresa, luego encontrar los departamentos y luego hacer una unión interna con los empleados, no obtendrá ninguna empresa que no tenga departamentos.
La razón de esto es que la WHERE
cláusula determina qué filas terminan en el resultado final, no partes individuales de las filas.
Y en este caso, debido a la unión izquierda, la columna Department.ID será NULL y, por lo tanto, cuando se trata de la UNIÓN INTERNA a Empleado, no hay forma de cumplir esa restricción para la fila Empleado, por lo que no Aparecer.
Por otro lado, si el optimizador de consultas decide abordar primero la unión departamento-empleado y luego hacer una unión izquierda con las empresas, las verá.
Entonces la sintaxis antigua es ambigua. No hay forma de especificar lo que desea, sin tratar con sugerencias de consulta, y algunas bases de datos no tienen ninguna manera.
Ingrese la nueva sintaxis, con esto puede elegir.
Por ejemplo, si desea todas las empresas, como se indica en la descripción del problema, esto es lo que escribiría:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
Aquí especifica que desea que la unión departamento-empleado se realice como una unión, y luego deja unirse a los resultados de eso con las empresas.
Además, supongamos que solo desea departamentos que contengan la letra X en su nombre. Una vez más, con las combinaciones de estilo antiguo, también corre el riesgo de perder la compañía, si no tiene departamentos con una X en su nombre, pero con la nueva sintaxis, puede hacer esto:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Esta cláusula adicional se usa para la unión, pero no es un filtro para toda la fila. Por lo tanto, la fila puede aparecer con información de la compañía, pero puede tener NULL en todas las columnas de departamento y empleado para esa fila, porque no hay departamento con una X en su nombre para esa compañía. Esto es difícil con la sintaxis anterior.
Es por eso que, entre otros proveedores, Microsoft ha desaprobado la sintaxis de combinación externa anterior, pero no la sintaxis de combinación interna anterior, desde SQL Server 2005 y versiones posteriores. La única forma de comunicarse con una base de datos que se ejecuta en Microsoft SQL Server 2005 o 2008, utilizando la sintaxis de combinación externa de estilo antiguo, es establecer esa base de datos en modo de compatibilidad 8.0 (también conocido como SQL Server 2000).
Además, la forma antigua, al arrojar un montón de tablas en el optimizador de consultas, con un montón de cláusulas WHERE, era similar a decir "aquí estás, haz lo mejor que puedas". Con la nueva sintaxis, el optimizador de consultas tiene menos trabajo que hacer para descubrir qué partes van juntas.
Entonces ahí lo tienes.
IZQUIERDA e INTERIOR es la ola del futuro.