MSSQL para SAP BO

Union en SQL Server: uso y ejemplos

3MC SqlQuery TresEmeConsulting

Este artículo proporcionará una revisión y verificación profunda en el operador SQL Union, describiendo sus múltiples usos junto con ejemplos y explorando algunas preguntas comunes como las diferencias de utilización entre Union vs Union All.

Para abordar y analizar los requisitos de datos que se aplican en el mundo real, es posible que podríamos necesitar combinar conjuntos de resultados de múltiples fuentes de datos para poder hacer un análisis de datos o crear nuevos conjuntos de datos. Los conjuntos de datos pueden ser idénticos, pero hay posibilidades de que se haga referencia a tablas diferentes. ¿Hay alguna manera de combinar los datos en una sola consulta? ¿Son los operadores de set una opción viable? Comencemos y veamos cómo se pueden usar algunos de los operadores existentes para ayudarnos a abordar estos desafíos comunes.

En este artículo, revisaremos:

  1. Lo que es un conjunto de operadores
  2. Union vs Union All y cómo funcionan
  3. Analizar las reglas para usar Union vs Union All
  4. Sintaxis del operador SQL
  5. Cómo usar una cláusula simple de Unión SQL en la instrucción select
  6. Cómo usar SQL Union con las consultas que tienen la cláusula WHERE
  7. Cómo usar la cláusula SELECT INTO con Union
  8. Cómo usar SQL Union con las consultas que tienen una cláusula WHERE y orden por cláusula
  9. Cómo usar SQL Union y SQL Pivot
  10. Cómo usar SQL Union con GRUPO y cláusulas HAVING

Operadores

Un operador es un símbolo o una palabra clave que define una acción que se realiza en una o más expresiones en la instrucción Select.

Establecer operador

Veamos los detalles de los los operadores de conjuntos en SQL Server y cómo usarlos.

Hay cuatro operadores básicos de conjuntos en SQL Server:

  1. Union
  2. Union All
  3. EXCEPT
  4. INTERSECT

Unión

El operador de Unión combina los resultados de dos o más consultas dando lugar a la creación de un único conjunto de resultados que incluye todas las filas que pertenecen a todas las consultas en la Unión. En esta operación, combina dos consultas más y elimina los duplicados.

Circle1 TresEmeConsulting

Por ejemplo, la tabla ‘A’ tiene 1,2 y 3 y la tabla ‘B’ tiene 3,4,5.

word image 414 TresEmeConsulting

El equivalente SQL de los datos anteriores es proporcionado a continuación

(
    SELECT 1 ID
    UNION
    SELECT 2
    UNION
    SELECT 3
)
UNION
(
    SELECT 3
    UNION
    SELECT 4
    UNION
    SELECT 5
);

En la salida de datos, puede ver una lista distinta de los registros de los dos conjuntos de resultados

word image 415 TresEmeConsulting

Union Total (Union All)

Cuando miramos Unión vs Unión total, pese a que encontramos que los mismos son bastante similares, pero se puede observar entre ellos que tienen algunas diferencias importantes desde la perspectiva de los resultados de rendimiento.

El operador UNION combina los resultados de dos o más consultas en un único conjunto de resultados los mismos que incluyen todas las filas que pertenecen a todas las consultas en la Unión. En términos simples, combina los dos o más conjuntos de filas y mantiene los duplicados.

word image 416 TresEmeConsulting

Por ejemplo, la tabla ‘A’ tiene 1,2 y 3 y la tabla ‘B’ tiene 3,4,5.

P SQL Union4 TresEmeConsulting

El equivalente SQL de los datos anteriores se proporciona a continuación

(
    SELECT 1 ID
    UNION
    SELECT 2
    UNION
    SELECT 3
)
UNION ALL
(
    SELECT 3
    UNION
    SELECT 4
    UNION
    SELECT 5
);

En la salida, puede ver todas las filas que también incluyen registros repetidos.

word image 418 TresEmeConsulting

INTERSECT

El operador intersect mantiene las filas que son comunes a todas las consultas.

word image 419 TresEmeConsulting

Para el mismo conjunto de datos del ejemplo mencionado anteriormente, se puede observar que la salida del operador de intersección se proporciona a continuación

word image 420 TresEmeConsulting

La representación SQL de las tablas anteriores.

(
    SELECT 1 ID
    UNION
    SELECT 2
    UNION
    SELECT 3
)
INTERSECT
(
    SELECT 3
    UNION
    SELECT 4
    UNION
    SELECT 5
);

La fila ‘3’ es común entre los dos conjuntos de resultados.

word image 421 TresEmeConsulting

EXCEPT O EXCLUSIÓN

El operador EXCEPT enumera las filas en el primero que no están en el segundo.

Circle2 TresEmeConsulting

Vale la pena mencionar Para el mismo conjunto de datos del ejemplo anteriormente indicado, la salida del operador Excepto se da a continuación

word image 423a TresEmeConsulting

La representación SQL de las tablas anteriores con el operador EXCEPT se proporciona a continuación

(
    SELECT 1 [Non-Common from only A ]
    UNION
    SELECT 2
    UNION
    SELECT 3
)
EXCEPT
(
    SELECT 3 B
    UNION
    SELECT 4
    UNION
    SELECT 5
);

Enumere las filas no comunes del primer conjunto o grupo de datos.

word image 424 TresEmeConsulting

Nota: Es muy fácil visualizar un operador de conjunto utilizando para tal fin un diagrama de Venn, donde cada una de las tablas está representada por formas que se cruzan. Las intersecciones de las formas, donde se superponen las tablas, son las filas donde se cumple una condición.

Sintaxis:

La sintaxis para los operadores UNION vs UNION ALL en SQL es la siguiente:

SELECT Column1, Column2, … ColumnN
FROM <table>
[WHERE conditions]
[GROUP BY Column(s]]
[HAVING condition(s)]
UNION
SELECT Column1, Column2, … ColumnN
FROM table
[WHERE condition(s)];
ORDER BY Column1,Column2…

Reglas:

Hay algunas reglas que se aplican a todos los operadores establecidos:

  1. Las expresiones en cada fila o el número de columnas que se definen en cada consulta deben tener el mismo orden
  2. Los conjuntos de filas de instrucciones SQL posteriores deben coincidir con el tipo de datos de la primera consulta
  3. Los paréntesis pueden construir otros operadores de conjuntos en la misma instrucción.
  4. Es posible tener una cláusula ORDER BY, pero esa debería ser la última instrucción del SQL
  5. Las cláusulas GROUP BY y HAVING se pueden aplicar a la consulta individual

Nota:

  1. Todos estos operadores Set eliminan duplicados, excepto el operador Union All
  2. Los nombres de las columnas de salida se refieren desde la primera consulta, es decir, cuando ejecutamos las instrucciones SELECT con cualquiera de los operadores Set y el conjunto de resultados de cada una de las consultas puede tener diferentes nombres de columna, por lo que el resultado de la instrucción SELECT hace referencia a los nombres de columna ejecutada en la primera consulta en dicha operación.
  3. Es importante mencionar que SQL JOIN se usa con mayor frecuencia para combinar columnas de varias tablas relacionadas, mientras que los operadores SET combinan filas de varias tablas.
  4. Cuando los tipos de expresión son iguales pero difieren en precisión, escala o longitud, el resultado que se obtiene y se determina se logra en base a las mismas reglas para combinar expresiones

Ejemplos:

Las siguientes consultas T-SQL se preparan y se ejecutan en la base de datos Adventureworks2014. La mima que usted puede descargar la muestra de AdventireWorks2014 base de datos aquí..

Cómo usar una simple cláusula de UNION en SQL en la instrucción selectEn este ejemplo, el conjunto de resultados incluye un conjunto distinto de filas del primer conjunto y en el segundo conjunto. El siguiente ejemplo se basa en las reglas 1, 3 y 5.

SELECT *
FROM
(
 (
     SELECT 1 A
     UNION
     SELECT 2
     UNION
     SELECT 3
 )
 UNION
 (
     SELECT 3 B
     UNION
     SELECT 4
     UNION
     SELECT 5
 )
 UNION ALL
  (
     SELECT 8 c
     UNION
     SELECT 9
     UNION
     SELECT 1
 )
) T;

La salida es una combinación de operadores Union y Union All los mismos que usan paréntesis.

.word image 425 TresEmeConsulting

2. Cómo usar SQL Union con las consultas que tienen la cláusula WHEREEl siguiente ejemplo muestra el uso de Union en dos instrucciones SELECT con una cláusula WHERE y una cláusula ORDER BY.El siguiente ejemplo se basa en las reglas 1,2 y 3.

SELECT P1.ProductModelID, 
       P1.Name
FROM Production.ProductModel P1
WHERE ProductModelID IN(3, 4)
UNION
SELECT P2.ProductModelID, 
       P2.Name
FROM Production.ProductModel P2
WHERE P2.ProductModelID IN(3, 4)
ORDER BY P1.Name;

word image 426 TresEmeConsulting

3. Cómo usar la cláusula SELECT INTO con SQL UnionEl siguiente ejemplo crea una nueva tabla dbo.dummy utilizando la cláusula INTO en la primera instrucción SELECT que contiene el conjunto de resultados finales de la Unión de las columnas ProductModel y el nombre de dos conjuntos de resultados diferentes. En este caso, se deriva de la misma tabla, pero en un caso y una situación del mundo real, esto también puede dar origen a que sean dos tablas diferentes. El siguiente ejemplo se basa en las reglas 1, 2 y 4.

DROP TABLE IF EXISTS dbo.dummy; 
SELECT P1.ProductModelID, 
       P1.Name
INTO dummy
FROM Production.ProductModel P1
WHERE ProductModelID IN(3, 4)
UNION
SELECT P2.ProductModelID, 
       P2.Name
FROM Production.ProductModel P2
WHERE P2.ProductModelID IN(3, 4)
ORDER BY P1.Name;  
GO  
 
SELECT *
FROM dbo.Dummy;


word image 427 TresEmeConsulting

4. Cómo usar SQL Union con las consultas que tienen una cláusula WHERE y una cláusula ORDER BY

Esto solo es posible cuando utilizamos funciones TOP o funciones agregadas en cada instrucción select del operador Union. En este caso, se enumeran las 10 filas principales de cada conjunto de resultados y luego las mismas se combinan con las filas usando la cláusula Union para obtener un resultado final. También usted verá que el orden por cláusula se coloca en toda la instrucción select.

SELECT a.ModelID, 
       a.Name
FROM
(
    SELECT TOP 10 ProductModelID ModelID, 
                  Name
    FROM Production.ProductModel
    WHERE ProductModelID NOT IN(3, 4)
    ORDER BY Name DESC
) a
UNION
SELECT b.ProductModelID, 
       b.Name
FROM
(
    SELECT TOP 10 ProductModelID, 
                  Name
    FROM Production.ProductModel
    WHERE ProductModelID IN(5, 6)
    ORDER BY Name DESC
) b;


word image 428 TresEmeConsulting

5. Cómo usar SQL Union y SQL Pivot

En el siguiente ejemplo, estamos tratando de combinar más de un conjunto de resultados. En una situación del mundo real, puede tener números financieros de varias regiones o departamentos y como las tablas pueden tener las mismas columnas y tipos de datos, pero usted desea colocarlos en un conjunto de filas y en un solo informe. En tal escenario, usaría la cláusula Union y es muy fácil combinar resultados y transformar los datos en un informe más significativo.En este ejemplo, ProductModel se clasifica en Top10, Top100, Top 100 y transforma las filas como un conjunto de valores agregados en las columnas respectivas. El siguiente ejemplo se basa en la regla 2.

SELECT MAX(Top10) Top10, 
       MAX(Top100) Top100, 
       MAX(Top1000) Top100
FROM
(
    SELECT COUNT(*) Top10, 
           0 Top100, 
           0 Top1000
    FROM Production.ProductModel
    WHERE ProductModelID < 10
    UNION
    SELECT 0, 
           COUNT(*), 
           0
    FROM Production.ProductModel
    WHERE ProductModelID > 11
          AND ProductModelID < 100
    UNION
    SELECT 0, 
           0, 
           COUNT(*)
    FROM Production.ProductModel
    WHERE ProductModelID > 101
) T;

Los valores NULL son muy importantes con los Operadores de conjuntos y se tratan como de bases de datos de ciudadanos de segunda clase. Debido a que los NULL se consideran únicos y si dos filas tienen un NULL en la misma columna, entonces se considerarían idénticos, por lo que, en ese caso, en realidad está comparando un NULL con un NULL y obteniendo igualdad. En el siguiente ejemplo, verá el uso de valores NULL. En este caso, usted puede observar que se opera con la función de agregado, máx.

SELECT MAX(Top10) Top10, 
       MAX(Top100) Top100, 
       MAX(Top1000) Top100
FROM
(
    SELECT COUNT(*) Top10, 
           NULL Top100, 
           NULL Top1000
    FROM Production.ProductModel
    WHERE ProductModelID < 10
    UNION
    SELECT NULL, 
           COUNT(*), 
           NULL
    FROM Production.ProductModel
    WHERE ProductModelID > 11
          AND ProductModelID < 100
    UNION
    SELECT NULL, 
           NULL, 
           COUNT(*)
    FROM Production.ProductModel
    WHERE ProductModelID > 101
) T;

word image 429 TresEmeConsulting

Cómo usar SQL Union con Instrucciones Group y Have

Los siguientes ejemplos usan el operador Unión para combinar el resultado de la tabla que tiene en su totalidad la cláusula condicional definida usando la cláusula Group by y Having clause.

El apellido se analiza especificando las condiciones en la cláusula have.

El siguiente ejemplo se basa en la regla 5.

SELECT pp.lastname, 
       COUNT(*) repeatedtwice, 
       0 Repeatedthrice
FROM Person.Person AS pp
     JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID
GROUP BY pp.lastname
HAVING COUNT(*) = 2
UNION
SELECT pp.LastName, 
       0, 
       COUNT(*) NtoZRange
FROM Person.Person AS pp
     JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID
GROUP BY pp.LastName
HAVING COUNT(*) > 2;

Podemos ver que los apellidos se derivan en dos columnas diferentes usando el operador Union

word image 430 TresEmeConsulting

Eso es todo por ahora …

Resumen

Hasta ahora, en esta sección nosotros hemos enfocado y abordamos varias opciones y reglas disponibles para usar los operadores Set y entender cuándo usarlas. Al determinar ya sea si se usan Union vs Union All, se podrá observar que hay algunos puntos a considerar. Use Union All si sabe que los conjuntos de resultados de múltiples consultas no se superponen o también los mismos generan duplicados y adicionalmente recuerde que, si necesita usar paréntesis, puede hacerlo. También puede pivotar y transformar la salida.

Sin embargo, usted solo debe asegurarse de que sus tipos de datos coincidan y si necesita hacer un ORDER BY, hágalo al final después de que haya ejecutado todas esas consultas establecidas. Por naturaleza, cuando se trata de Union vs Union All, Union All es más rápido que Union; ya que los operadores de la Unión incurren en mayores gastos generales adicionales para eliminar duplicados.

Espero que ustedes hayan disfrutado este artículo sobre el operador SQL Union. No dude en hacer cualquier pregunta en los comentarios a continuación.


Shares: