ORDER BY y UNION en SQL Server
En SQL Server tenemos la posibilidad de unir consultas y ordenar el resultado, ORDER BY y UNION en SQL Server hacen esta tarea, veamos sus opciones.
Para los ejemplos siguientes utilizare la base de datos NorthWind en SQL Server 2017.
Podría interesarte Restaurar base de datos .bak en SQL server 2017
UNION BASICO
Tenemos la siguiente consulta utilizando UNION.
SELECT
ContactName AS 'Nombre',
ContactTitle AS 'Title',
Address,
City,
PostalCode
FROM
Customers
UNION
SELECT
(FirstName+' -- '+LastName) AS 'Nombre',
Title,
Address,
City,
PostalCode
FROM
Employees;
En el primer select obtengo datos de la tabla Costumers, coloco la sentencia UNION y en la segunda consulta obtengo los datos de Employees.
Para que no se genere algún error es necesario utilizar en ambas consultas los mismos encabezados.
Para asignar encabezados utilizo la sentencia AS seguido de la descripción de la columna.
ORDER BY en UNION
Utilizando la consulta anterior aplicaremos la sentencia ORDER BY.
SELECT
ContactName AS 'Nombre',
ContactTitle AS 'Title',
Address,
City,
PostalCode
FROM
Customers
UNION
SELECT
(FirstName+' -- '+LastName) AS 'Nombre',
Title,
Address,
City,
PostalCode
FROM
Employees
ORDER BY
Nombre ASC;
La sentencia ORDER BY se coloca al final de las dos consultas unidas.
El ordenamiento se realiza al resultado de las dos consultas y no solo a la consulta al que tiene arriba.
Es posible ordenar el resultado a partir de cualquier columna, para este ejemplo lo ordeno por el Nombre.
Ascendente y descendente:
- ASC: Orden ascendente de las consultas (de menor a mayor o de la A a la Z).
- DESC: Orden descendente de las consultas (de mayor a menor o de la Z a la A).
Podría interesarte Group by en SQL Server
ORDER BY en las dos consultas con UNION
Para utilizar la sentencia ORDER BY en ambas consultas y unidas con UNION es necesario utilizar otra sentencia.
La sentencia que utilizare en esta ocasión es TOP, este devuelve un numero especifico de filas en la consulta.
¿Qué pasa si no la utilizo?, se genera un error en la ejecución de la consulta:
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.
Veamos el ejemplo para obtener estas consultas:
SELECT
*
FROM(
SELECT
TOP (SELECT COUNT(*) FROM Customers)
ContactName AS 'Nombre',
ContactTitle AS 'Title',
Address,
City,
PostalCode
FROM
Customers
ORDER BY
Nombre ASC
) AS Tabla1
UNION ALL
SELECT
*
FROM(
SELECT
TOP (SELECT COUNT(*) FROM Employees)
(FirstName+' -- '+LastName) AS 'Nombre',
Title,
Address,
City,
PostalCode
FROM
Employees
ORDER BY
Nombre DESC
) AS Tabla2;
Cada una de las consultas principales las encerramos en nuevas consultas, de esta forma obtenemos Tabla1 y Tabla2.
Para evitar el error del que les comentaba arriba utilizo la sentencia TOP seguida del número de filas de cada tabla.
SELECT COUNT(*) FROM Employees;
La consulta anterior devuelve el número de final de la tabla Employees, TOP requiere que especifiquemos el número de final a devolver.
Podría interesarte Conexión a base de datos SQL Azure
Observaciones
La consulta con dos ORDER BY y UNION es posible que reduzca la velocidad de la consulta debido a las múltiples consultas realizadas.