ventajas - Consulta SQL-Uso de Order By en UNION
sybase ventajas y desventajas (16)
A veces necesita tener el ORDER BY
en cada una de las secciones que necesitan combinarse con UNION
.
En este caso
SELECT * FROM
(
SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1
UNION ALL
SELECT * FROM
(
SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2
¿Cómo se puede ordenar programáticamente una consulta de unión cuando se extraen datos de dos tablas? Por ejemplo,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Lanza una excepción
Nota: esto se intenta en el motor de base de datos MS Access Jet
Al navegar por esta sección de comentarios, encontré dos patrones diferentes para responder a la pregunta. Lamentablemente para SQL 2012, el segundo patrón no funciona, así que aquí está mi "solución alternativa"
Ordenar por una columna común
Este es el caso más fácil que puede encontrar. Como muchos usuarios señalaron, todo lo que necesitas hacer es agregar un Order By
al final de la consulta
SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1
o
SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1
Ordenar por diferentes columnas
Aquí es donde realmente se vuelve complicado. Utilizando SQL 2012, probé la publicación superior y no funciona.
SELECT * FROM
(
SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1
UNION ALL
SELECT * FROM
(
SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2
Siguiendo la recomendación en el comentario, probé esto
SELECT * FROM
(
SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1
UNION ALL
SELECT * FROM
(
SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2
Este código sí se DUMMY_ALIAS1
pero DUMMY_ALIAS1
y DUMMY_ALIAS2
anulan el Order By
establecido en la instrucción Select
que lo hace inservible.
La única solución en la que podía pensar, que funcionó para mí, no fue utilizar una unión y en su lugar hacer que las consultas se ejecutaran individualmente y luego lidiar con ellas. Entonces, básicamente, no usar una Union
cuando desee Order By
Al usar el orden por separado, cada subconjunto obtiene el orden, pero no el conjunto completo, que es lo que le gustaría unir dos tablas.
Debería usar algo como esto para tener un conjunto ordenado:
SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM table2)
AS unitedTables ORDER BY field5 DESC
Aquí hay un ejemplo de Northwind 2007:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
La cláusula ORDER BY solo tiene que ser la última declaración, después de haber hecho toda su unión. Puede unir varios conjuntos, luego colocar una cláusula ORDER BY después del último conjunto.
Así es como se hace
select * from
(select top 100 percent pointx, pointy from point
where pointtype = 1
order by pointy) A
union all
select * from
(select top 100 percent pointx, pointy from point
where pointtype = 2
order by pointy desc) B
Creo que esto hace un buen trabajo de explicación.
La siguiente es una consulta UNION que usa una cláusula ORDER BY:
select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;
Dado que los nombres de columna son diferentes entre las dos sentencias "select", es más ventajoso hacer referencia a las columnas en la cláusula ORDER BY por su posición en el conjunto de resultados.
En este ejemplo, hemos ordenado los resultados por company_name
/ company_name
en orden ascendente, como se indica mediante "ORDENAR POR 2".
Los campos company_name
/ company_name
están en la posición n. ° 2 en el conjunto de resultados.
Tomado de aquí: http://www.techonthenet.com/sql/union.php
Esta es la cosa más estúpida que he visto, pero funciona, y no se puede discutir con los resultados.
SELECT *
FROM (
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable
El interior de la tabla derivada no se ejecutará solo, pero como una tabla derivada funciona perfectamente bien. Intenté esto con SS 2000, SS 2005, SS 2008 R2 y los tres trabajos.
La segunda tabla no puede incluir el nombre de la tabla en la cláusula ORDER BY
.
Asi que...
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1
No lanza una excepción
Si es necesario para mantener la clasificación interna:
SELECT 1 as type, field1 FROM table1
UNION
SELECT 2 as type, field1 FROM table2
ORDER BY type, field1
Usando un ejemplo concreto:
SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name
Archivos:
name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip
Carpetas:
name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents
Salida deseada: (resultados de la primera selección primero, es decir, carpetas primero)
Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt
SQL para lograr los resultados deseados:
SELECT name
FROM (
SELECT 1 AS rank, name FROM Folders
UNION
SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name
Para Sql Server 2014/2012 / Others (sin control):
SELECT * FROM
(
SELECT table1.field1 FROM table1 ORDER BY table1.field1
)
as DUMMY_ALIAS1
UNION ALL
SELECT * FROM
(
SELECT table2.field1 FROM table2 ORDER BY table2.field1
)
as DUMMY_ALIAS2
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD
Prueba esto. Funcionó para mí
(SELECT table1.field1 FROM table1
UNION
SELECT table2.field1 FROM table2) ORDER BY field1
¿Trabajo? Recuerde pensar conjuntos. Obtenga el conjunto que desea utilizando una unión y luego realice sus operaciones en él.
SELECT field1
FROM ( SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
) AS TBL
ORDER BY TBL.field1
(use ALIAS)
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
SELECT table1Column1 as col1,table1Column2 as col2
FROM table1
UNION
( SELECT table2Column1 as col1, table1Column2 as col2
FROM table2
)
ORDER BY col1 ASC