sábado, 4 de junio de 2016

Receta T-SQL No. 4-4: ¿Cómo Convertir Dos Tablas en Opcionales en una Operación JOIN?

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
6. Práctica: Unión de Tablas con FULL OUTER JOIN
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En esta receta T-SQL se describe cómo hacer que una operación JOIN se recuperen los registros de dos tablas aún cuando no hayan coincidencias en los campos de comparación. Para llevar esta tarea a cabo se recurre al uso de la construcción sintáctica FULL OUTER JOIN.

2. Palabras Clave

  • JOIN
  • Registro
  • Tabla

3. Problema

Unir dos tablas por un campo común; e inclusive recuperar los registros que no coincidan.

4. Solución

T-SQL cuenta con las palabras reservadas FULL OUTER JOIN para solucionar este problema.

5. Discusión de la Solución

5.1 FULL OUTER JOIN

Con FULL OUTER JOIN o FULL JOIN se recupera no sólo los registros de dos tablas que poseen valores que coinciden sino además todos los registros que no coinciden. En la Figura 1 se describe gráficamente la unión de dos conjuntos (tablas para este contexto).
FULL OUTER JOIN
Figura 1. FULL OUTER JOIN.

Como ejemplo la unión de las tablas SalesOrderDetail y Product por medio de las columnas ProductID.

SELECT p.Name AS 'Nombre Producto',
sod.SalesOrderID AS 'ID de Orden de Venta'
FROM Production.Product AS p
FULL OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID;

Por una parte, los resultados que muestra registros que coinciden:
Product FULL OUTER JOIN SalesOrderDetail con registros que coinciden
Figura 2. FULL OUTER JOIN entre Product y SalesOrderDetail con registros que coinciden.
Y aquellos registros que no tienen coinciden:
FULL OUTER JOIN entre Product y SalesOrderDetail con registros que no coinciden.
Figura 3. FULL OUTER JOIN entre Product y SalesOrderDetail con registros que no coinciden.
Nótese en la columna ID de Orden de Venta que los valores son NULL; esto quiere decir que no hay coincidencia entre registros de una tabla respecto a la otra y aún así se muestran como resultados.

6. Práctica: Unión de Dos Tablas con FULL OUTER JOIN

En este ejemplo se unen tres tablas usando el operador FULL OUTER JOIN. Las tablas a unir son:
  • Sales.SalesOrderHeader
  • Sales.SalesOrderHeaderSalesReason, y 
  • Sales.SalesReason
El propósito es garantizar lo siguiente:
  • obtener todos los registros (filas) resultantes de una operación INNER JOIN
  • registros que no están asociados a una venta, 
  • registros que no están asociados a cada razón de venta en una orden de compra.
Este el código T-SQL que obtiene los registros descritos:

SELECT soh.SalesOrderID,
sr.SalesReasonID,
sr.Name
FROM Sales.SalesOrderHeader soh
FULL OUTER JOIN Sales.SalesOrderHeaderSalesReason sohsr
ON soh.SalesOrderID = sohsr.SalesOrderID
FULL OUTER JOIN Sales.SalesReason sr
ON sr.SalesReasonID = sohsr.SalesReasonID;

Estos resultados (parciales) corresponden con las órdenes que tienen asociadas razones de orden de venta:
FULL OUTER JOIN  entre SalesOrderHeader, SalesOrderHeaderSalesReason y SalesReason con registros que coinciden
Figura 4. FULL OUTER JOIN entre SalesOrderHeader, SalesOrderHeaderSalesReason y SalesReason con registros que coinciden.
Este otro conjunto de resultados corresponden con las órdenes de compra que no tienen asociadas una razón de compra:
FULL OUTER JOIN  entre SalesOrderHeader, SalesOrderHeaderSalesReason y SalesReason sin registros que coinciden
Figura5. FULL OUTER JOIN entre SalesOrderHeader, SalesOrderHeaderSalesReason y SalesReason sin registros que coinciden.

7. Conclusiones

Esta receta demostró el uso de del operador FULL OUTER JOIN: este operador permite retornar aquellos registros que coinciden con un campo de comparación e inclusivo aquellos que no.

La próxima receta T-SQL demuestra cómo generar todos las posibles combinaciones de registros.

8. Literatura & Enlaces

Brimhall, J., Dye, D., Gennick, J., Roberts, A., Sheffield, W. (2012). SQL Server 2012 T-SQL Recipes - A Problem-Solution Approach. United States: Apress.
SQL FULL OUTER JOIN Keyword (2016, junio 4). Recuperado desde: http://www.w3schools.com/sql/sql_join_full.asp
Using Outer Joins (2016, junio 4). Recuperado desde: https://technet.microsoft.com/en-us/library/ms187518%28v=sql.105%29.aspx?f=255


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.