SQL Query - Usando Order By no UNIÃO
-
03-07-2019 - |
Pergunta
Como pode um programaticamente tipo uma consulta de união ao puxar dados de duas tabelas? Por exemplo,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Lança uma exceção
Nota: este está sendo tentada no motor de banco de dados MS Access Jet
Solução
Às vezes, você precisa ter a ORDER BY
em cada uma das seções que precisam ser combinados com UNION
.
Neste 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
Outras dicas
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
Eu acho que isso faz um bom trabalho de explicar.
A seguir é uma consulta de união que usa uma 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;
Uma vez que os nomes das colunas são diferentes entre os dois "selecione" declarações, é mais vantajoso para referenciar as colunas na cláusula ORDER BY pela sua posição no conjunto de resultados.
Neste exemplo, temos ordenados os resultados por supplier_name
/ company_name
em ordem crescente, conforme indicado pela "ORDER BY 2".
Os campos supplier_name
/ company_name
estão em posição # 2 na
conjunto de resultados.
Tomado aqui: http://www.techonthenet.com/sql/union.php
Usando um exemplo 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
Pastas:
name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents
saída desejada: (resultados de primeira escolha em primeiro lugar, ou seja, pastas primeiros)
Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt
SQL para alcançar os resultados desejados:
SELECT name
FROM (
SELECT 1 AS rank, name FROM Folders
UNION
SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name
Aqui está um exemplo 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;
A cláusula ORDER BY só precisa ser a última declaração, depois de ter feito toda a sua unioning. Você pode sindicais vários conjuntos juntos, em seguida, colocar uma cláusula ORDER BY após o último set.
(SELECT table1.field1 FROM table1
UNION
SELECT table2.field1 FROM table2) ORDER BY field1
Work? Lembre-se pensar sets. Obter o conjunto que pretende usando uma união e, em seguida, executar suas operações nele.
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
(uso ALIAS)
Esta é a coisa mais estúpida que eu já vi, mas funciona, e você não pode argumentar com os resultados.
SELECT *
FROM (
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable
O interior da tabela derivada não será executado em seu próprio, mas como uma tabela derivada funciona perfeitamente bem. Eu tentei isso na SS 2000, a SS de 2005, SS 2008 R2, e todos os três de trabalho.
Esta é a forma como ele é feito
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 este comentário seção I veio em dois padrões diferentes responder à pergunta. Infelizmente para SQL 2012, o segundo padrão não funciona, então aqui está a minha "em torno do trabalho"
ORDER BY em uma coluna comum
Este é o caso mais fácil que você pode encontrar. Como muitos usuário apontou, tudo que você realmente precisa fazer é adicionar um Order By
no final da consulta ??p>
SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1
ou
SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1
ORDER BY em colunas diferentes
Aqui é onde ele realmente fica complicado. Usando o SQL 2012, eu tentei o posto mais alto e ele não 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
Após a recomendação no comentário que eu tentei este
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 fez compilação mas a sobreposição DUMMY_ALIAS1
e DUMMY_ALIAS2
o Order By
estabelecida na declaração Select
o que torna esta inutilizável.
A única solução que eu poderia pensar, que funcionou para mim não estava usando uma união e, em vez de fazer as consultas executadas individualmente e então lidar com eles. Então, basicamente, não usando um Union
quando você quer Order By
Usando fim separadamente cada subconjunto recebe ordem, mas não todo o conjunto, que é o que você deseja unir duas tabelas.
Você deve usar algo como isto ter um 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
A segunda tabela não pode incluir o nome da tabela na cláusula ORDER BY
.
Então ...
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1
Não lançar uma exceção
Se for necessário para manter a classificação 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
Tente isto. Ela trabalhou para mim.
Para o SQL Server 2014/2012 / Outros (não marcado):
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