versiones ventajas tutorial historia desventajas central sql ms-access sorting sql-order-by union

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