SQL 쿼리-UNION에서 Order By 사용


83

두 테이블에서 데이터를 가져올 때 어떻게 통합 쿼리를 프로그래밍 방식으로 정렬 할 수 있습니까? 예를 들면

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

예외가 발생합니다.

참고 : 이것은 MS Access Jet 데이터베이스 엔진에서 시도되고 있습니다.

답변:


118

때때로 당신은있을 필요가 ORDER BY결합해야하는 각 섹션에 UNION.

이 경우

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

1
주문이 결과 집합에 영향을 미칠 때 나를 위해 일했습니다 (Top x를 사용할 때와 같이)
James Barrass

이것이 바로 제가 찾고있는 것입니다! 감사!
Srichand Yella 2011

나를 위해 잘 작동합니다 ... 외부 선택에 테이블 별칭이 있는지 확인해야합니다. 날 물었다.
Troy

Microsoft SQL Server Standard (64 비트) 버전 11.0.5058.0에서이 구문을 사용하는 데 문제가 없었 습니다.
hlovdal

3
SSMS에서 당신은에 하위 쿼리를 변경해야합니다 SELECT TOP 100 PERCENT사용하기 위해서는 ORDER BY서브 쿼리에서
조셉 Nields

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

18
이것은 기술적으로 원래 질문에서 논리적으로 요청한 것을 수행하지 않습니다.
Ian Boyd

2
@Ian Boyd : 나는 당신의 요점을 받아들이지 만 그들이 요구하는 것은 논리적으로 의미가 없습니다 : 조합은 세트에서 작동하고 세트는 순서가 없습니다!
onedaywhen

8
@onedaywhen 원래 작성자는 두 개의 정렬 된 결과 집합을 연결하려고합니다. UNION그렇게되는 것을 허용하지 않습니다. 이를 수행하는 다른 구조가있을 수 있습니다. 없을 수도 있습니다. 어느 쪽이든이 답변은 작성자가 요청한 것을 기술적으로 달성하지 못합니다.
Ian Boyd

4
@Ian Boyd : SQL에서는 ORDER BY커서의 일부이지만 UNION테이블에서 작동하므로 코드가 작동하지 않습니다. 터무니없는 코드에서 OP의 의도를 어떻게 추론 할 수 있는지 알 수 없습니다. SQL이 UNION중복을 제거 한다고 생각해보십시오 . 이것이 "정렬 된 결과 집합" {1, 2, 3} UNION {2, 4, 6}이라면 결과는 {1, 2, 3, 4, 6}또는 {1, 3, 2, 4, 6}? "정렬 된 결과 집합"의 결합이 SQL과 관련하여 정의되지 않았고 OP가 지정되지 않았기 때문에 알 수 없습니다.
onedaywhen

MYSQL을 사용하고 있으며 모든 select 문에 필드 (Ordering 필드)를 포함했습니다. 그런 다음 마지막에 Order by by를 추가했습니다. 잘 작동합니다.
CreativeManix

57

나는 이것이 설명하는 데 좋은 일이라고 생각합니다.

다음은 ORDER BY 절을 사용하는 UNION 쿼리입니다.

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;

두 "select"문간에 열 이름이 다르기 때문에 결과 집합에서의 위치에 따라 ORDER BY 절의 열을 참조하는 것이 더 유리합니다.

이 예에서는 "ORDER BY 2"로 표시된대로 오름차순으로 supplier_name/ 기준 company_name으로 결과를 정렬했습니다 .

supplier_name/의 company_name필드는 결과 세트 # 2의 위치에있다.

여기에서 가져옴 : http://www.techonthenet.com/sql/union.php


28

구체적인 예를 사용하여 :

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

파일 :

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

폴더 :

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

원하는 출력 : (첫 번째 선택의 결과, 즉 폴더 먼저)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

원하는 결과를 얻기위한 SQL :

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

3
이는 지금까지 가장 좋은 대답이다
javier_domenech

1
이것은 훌륭한 대답입니다!
Ali Gonabadi

참고- 파생 테이블에 별칭 을 지정 해야합니다 (이 예제에 표시된대로 dt). 그렇지 않으면 작동하지 않습니다. 나는 시작하기 위해 세부 사항을 생략하고 SSMS에서 던진 오류 메시지가 특별히 도움이되지 않았기 때문에 잠시 당황했습니다.
CactusCake

17

다음은 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;

ORDER BY 절은 모든 통합을 완료 한 후 마지막 문이어야합니다. 여러 세트를 합친 다음 마지막 세트 뒤에 ORDER BY 절을 넣을 수 있습니다.


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

작업? 생각 세트를 기억하십시오. 유니온을 사용하여 원하는 세트를 얻은 다음 작업을 수행하십시오.


정렬하려는 필드의 이름이 다른 경우 order by 절에 서수 값을 사용할 수도 있습니다
Anson Smith

5
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC

4
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(ALIAS 사용)


@DisplacedGuy MJ가 질문에 대한 더 나은 답을 가지고 있다면 위의 어느 것보다 더 나은 답이 있고,이 경우 수용된 답에 분명히 문제가있는 경우 MJ는 할 수 있어야하며 나는 그에게 새로운 답을 남길 것을 권장합니다
MobileMon

그리고 btw, MJ의 대답이 최고입니다! (적어도 나를 위해)
MobileMon

4

이것은 내가 본 것 중 가장 어리석은 일이지만 효과가 있으며 결과에 대해 논쟁 할 수 없습니다.

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

파생 테이블의 내부는 자체적으로 실행되지 않지만 파생 테이블은 완벽하게 작동합니다. SS 2000, SS 2005, SS 2008 R2 및 세 가지 작업 모두에서 이것을 시도했습니다.


2

이것이 수행되는 방법입니다.

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

2

이 댓글 섹션을 탐색하면서 질문에 답하는 두 가지 다른 패턴을 발견했습니다. 슬프게도 SQL 2012의 경우 두 번째 패턴이 작동하지 않으므로 여기에 "해결 방법"이 있습니다.


공통 열에서 정렬

이것은 당신이 만날 수있는 가장 쉬운 경우입니다. 많은 사용자가 지적한 것처럼 Order By쿼리 끝에를 추가하기 만하면됩니다.

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

또는

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

다른 열에서 정렬

여기가 실제로 까다로워지는 부분입니다. SQL 2012를 사용하여 상위 게시물을 시도했지만 작동하지 않습니다.

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

댓글의 권장 사항에 따라 이것을 시도했습니다.

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

이 코드는 컴파일하지만 않았다 DUMMY_ALIAS1DUMMY_ALIAS2(가) 무시 Order By년에 설립 된 Select이 사용할 수 없게 문.

내가 생각할 수있는 유일한 해결책은 통합을 사용하지 않고 쿼리를 개별적으로 실행 한 다음 처리하는 것이 었습니다. 그래서 기본적으로 사용하지 않을 Union경우에 할 때Order By


1

순서를 개별적으로 사용하면 각 하위 집합이 순서를 얻지 만 전체 집합이 아닌 두 테이블을 통합 할 수 있습니다.

하나의 주문 세트 를 가지려면 다음과 같은 것을 사용해야합니다 .

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

0

두 번째 테이블은 ORDER BY절에 테이블 이름을 포함 할 수 없습니다 .

그래서...

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

예외를 발생시키지 않습니다.


이것은 정말 좋은 질문이었습니다. 버전 또는 중첩 버전이 원하는 결과를 반환하는지 여부를 알 수 있습니까? 아니면 둘 다 동일한 결과를 반환합니까? 그렇다면 ORDER BY를 한 번만 수행하므로 (다른 사람의) 중첩 솔루션이 더 성능이 좋을까요?
DOK

Jet 엔진의 성능 이점은 확실하지 않지만 중첩으로 인해 가독성이 향상되었다고 말할 수 있습니다.
Curtis Inderwiesche

0

내부 정렬을 유지해야하는 경우 :

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1

0
(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

이 시도. 그것은 나를 위해 일했습니다.


0

SQL Server 2014 / 2012 / 기타 (확인되지 ​​않음) :

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

이것을 시도하면 2012에서 컴파일 오류가 발생합니다. 스크립트는 저장 프로 시저에 대해 작동하지 않습니다. 당신은 최고의 조항이 필요합니다.
Timothy Dooling 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.