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

Foi útil?

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

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top