Uso de combinaciones externas

Completado

Aunque no es tan común como las 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. Pero no solo recuperará las filas con atributos coincidentes, sino también todas las filas presentes en una tablas o las dos, 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 genera los resultados de una consulta INNER JOIN filtrando las filas que no cumplen las condiciones expresadas en el predicado de la cláusula ON. El resultado es que solo se devuelven las filas con una fila coincidente en la otra tabla. Con OUTER JOIN, puede optar por mostrar todas las filas que tienen filas coincidentes entre las tablas, además de todas las filas que no tienen ninguna coincidencia en la otra tabla. Ahora se verá un ejemplo y, después, se examinará el proceso.

En primer lugar, examine la consulta siguiente, 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. En los resultados solo aparecerán los valores EmployeeID que están en ambas tablas.

A Venn diagram showing the matching members of the Employee and SalesOrder sets

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 indica al procesador de consultas que conserve todas las filas de la tabla de la izquierda (HR.Employee) y muestre los valores Amount para las filas coincidentes en Sales.SalesOrder. Pero se devuelven todos los empleados, independientemente de si han realizado o no un pedido de ventas. En lugar del valor Amount, la consulta devolverá NULL para los empleados sin pedidos de ventas correspondientes.

A Venn diagram showing the outer join results of the Employee and SalesOrder sets

Sintaxis de OUTER JOIN

Las combinaciones externas se expresan mediante las palabras clave LEFT, RIGHT o FULL, que se colocan por delante de 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 mostrar todas sus filas, haya coincidencias o no.

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;

Pero como sucede con la palabra clave INNER, a menudo resulta útil escribir código que indique de forma explícita el tipo de combinación que se usa.

Al escribir consultas mediante OUTER JOIN, tenga en cuenta las instrucciones siguientes:

  • Como ha visto, se prefieren alias de tabla, no solo para la lista SELECT, sino también para la cláusula ON.
  • Como sucede con INNER JOIN, se puede realizar una operación OUTER JOIN 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 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 se usa OUTER JOIN. La presencia de valores NULL en los resultados de OUTER JOIN puede provocar problemas si los resultados intermedios se combinan a una tercera tabla. El predicado de la segunda combinación puede filtrar las filas con valores NULL.
  • 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, más todas las filas de la primera tabla sin coincidencia en la segunda, además de todas las filas de la segunda sin coincidencia en la primera.
  • No hay ninguna manera de predecir el orden en que se devolverán las filas sin una cláusula ORDER BY. No hay ninguna manera de saber si primero se devolverán las filas coincidentes o las no coincidentes.