Usar uniones externas
Aunque no es tan común como combinaciones internas, el uso de combinaciones externas en una consulta de varias tablas puede proporcionar una vista alternativa de los datos empresariales. Como sucede con las combinaciones internas, expresará una relación lógica entre las tablas. Sin embargo, no solo recuperará filas con atributos coincidentes, sino también todas las filas presentes en una o ambas tablas, independientemente de si hay o no una coincidencia en la otra tabla.
Anteriormente, ha aprendido a usar INNER JOIN para buscar filas coincidentes entre dos tablas. Como ha visto, el procesador de consultas compila los resultados de una consulta INNER JOIN filtrando las filas que no cumplen las condiciones expresadas en el predicado de cláusula ON. El resultado es que solo se devuelven filas con una fila coincidente en la otra tabla. Con outer JOIN, puede elegir mostrar todas las filas que tienen filas coincidentes entre las tablas, además de todas las filas que no tienen una coincidencia en la otra tabla. Echemos un vistazo a un ejemplo y, a continuación, exploremos el proceso.
En primer lugar, examine la siguiente consulta, escrita con INNER JOIN:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
INNER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Estas filas representan una coincidencia entre hr.employee y sales.salesorder. Solo los valores employeeID que se encuentran en ambas tablas aparecerán en los resultados.
Ahora, se examinará la siguiente consulta, escrita como LEFT OUTER JOIN:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT OUTER JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
En este ejemplo se usa un operador LEFT OUTER JOIN, que dirige al procesador de consultas para conservar todas las filas de la tabla a la izquierda (HR. Employee) y muestra los valores Amount para las filas coincidentes en Sales.SalesOrder. Sin embargo, se devuelven todos los empleados, independientemente de si han tomado un pedido de venta o no. En lugar del valor Amount , la consulta devolverá NULL para los empleados sin pedidos de ventas coincidentes.
Sintaxis de OUTER JOIN
Las uniones externas se expresan mediante las palabras clave LEFT, RIGHT o FULL que preceden a OUTER JOIN. El propósito de la palabra clave es indicar qué tabla (en qué lado de la palabra clave JOIN) se debe conservar y tener todas sus filas mostradas; match, o ninguna coincidencia.
Al usar LEFT, RIGHT o FULL para definir una combinación, puede omitir la palabra clave OUTER como se muestra aquí:
SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp
LEFT JOIN Sales.SalesOrder AS ord
ON emp.EmployeeID = ord.EmployeeID;
Sin embargo, al igual que la palabra clave INNER, a menudo resulta útil escribir código explícito sobre el tipo de combinación que se usa.
Al escribir consultas mediante OUTER JOIN, tenga en cuenta las siguientes directrices:
- Como ha visto, se prefieren los alias de tabla no solo para la lista SELECT, sino también para la cláusula ON.
- Al igual que con INNER JOIN, se puede realizar una COMBINACIÓN EXTERNA en una sola columna coincidente o en varios atributos coincidentes.
- A diferencia de INNER JOIN, el orden en el que las tablas se enumeran y se unen en la cláusula FROM hace importa con OUTER JOIN, ya que determinará si elige LEFT o RIGHT para la combinación.
- Las combinaciones de varias tablas son más complejas cuando hay una combinación EXTERNA presente. La presencia de NULL en los resultados de OUTER JOIN puede provocar problemas si los resultados intermedios se unen a una tercera tabla. El predicado de la segunda combinación puede filtrar las filas con valores nulos.
- Para mostrar solo las filas en las que no existe ninguna coincidencia, agregue una prueba de NULL en una cláusula WHERE después de un predicado OUTER JOIN.
- FULL OUTER JOIN rara vez se usa. Devuelve todas las filas coincidentes entre las dos tablas, junto con las filas de la primera tabla que no tienen coincidencias en la segunda, y las de la segunda que no tienen coincidencias en la primera.
- No hay ninguna manera de predecir el orden en que las filas volverán sin una cláusula ORDER BY. No hay forma de saber si las filas coincidentes o no coincidentes se devolverán primero.