Índice
1. Introducción2. 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).
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:
Figura 2. FULL OUTER JOIN entre Product y SalesOrderDetail con registros que coinciden. |
Y aquellos registros que no tienen 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:
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:
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.