Pregunta

¿Cómo se puede ordenar por programación una consulta de unión al extraer 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 está intentando en el motor de base de datos MS Access Jet

¿Fue útil?

Solución

En ocasiones, debe tener el ORDER BY en cada una de las secciones que deben 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

Otros consejos

SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

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 las columnas son diferentes entre los dos " seleccione " En las declaraciones, 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 supplier_name / company_name en orden ascendente, como se indica en la sección " ORDENAR POR 2 " ;.

Los campos supplier_name / company_name están en la posición # 2 en la conjunto de resultados.

Tomado de aquí: http://www.techonthenet.com/sql/union.php

Usando un ejemplo concreto:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

Files:

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: (los resultados de la primera selección primero, es decir, las 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

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 necesita ser la última declaración, después de que haya hecho toda su unión. Puede unir varios conjuntos, luego poner una cláusula ORDER BY después del último conjunto.

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

¿Trabajar? Recuerda pensar conjuntos. Obtenga el conjunto que desea mediante una unión y luego realice sus operaciones en él.

SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(use ALIAS)

Esta es la cosa más estúpida que he visto, pero funciona, y no puedes discutir 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á por sí solo, pero como tabla derivada funciona perfectamente bien. He intentado esto en SS 2000, SS 2005, SS 2008 R2 y los tres trabajos.

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

Navegando en esta sección de comentarios, me encontré con dos patrones diferentes que respondían la pregunta. Lamentablemente para SQL 2012, el segundo patrón no funciona, así que aquí está mi " workee "


Ordenar por en una columna común

Este es el caso más fácil que puedes encontrar. Como señalaron muchos usuarios, todo lo que necesita 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 en diferentes columnas

Aquí es donde realmente se pone complicado. Usando SQL 2012, probé la publicación principal 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 del comentario, intenté 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 se compiló, pero DUMMY_ALIAS1 y DUMMY_ALIAS2 anulan el Order By establecido en la declaración de Select que hace que esto sea inutilizable.

La única solución en la que pude pensar, que funcionó para mí, no fue usar un sindicato y, en cambio, hacer que las consultas se ejecuten individualmente y luego tratarlas. Básicamente, no utilizar un Union cuando desee Order By

Al utilizar el orden por separado, cada subconjunto recibe el orden, pero no todo el conjunto, que es lo que desearía unir dos tablas.

Deberías usar algo como esto para tener uno 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

La segunda tabla no puede incluir el nombre de la tabla en la cláusula ORDER BY .

Entonces ...

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
(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. Funciono para mi

Para SQL Server 2014/2012 / Otros (no verificado):

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top