SQL에서 Union으로 주문하는 방법은 무엇입니까?


201

많은 선택에서 데이터를 가져오고 결합 할 때 주문할 수 있습니까? 와 같은

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"

이 쿼리를 이름별로 어떻게 주문할 수 있습니까?

일부는 당신이 이런 식으로 쿼리 할 수 ​​있다고 말했습니다.

Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name

그러나이 경우 나는 그 해결책을 무시합니다.


1
통합 쿼리에 동일한 열이 있으면 마지막에 열 이름으로 주문을 넣습니다.
anirban karak

답변:


266

그냥 써

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Order by name

order by는 전체 결과 집합에 적용됩니다


45
정렬을 UNION의 최상위 항목에만 적용하려면 어떻게해야합니까?
marifrahman

7
@marifrahman 내 답변보기 stackoverflow.com/a/43855496/2340825
BA TabNabber

2
@marifrahman은 (는) 오래된 주제를 파고 미안하지만 다른 사람들을 도울 수 있습니다. ORDER BY를 UNION의 첫 번째 부분에 적용하려면이 SELECT를 괄호로 보호하십시오.
Lideln Kyoku

82
Select id,name,age
from
(
   Select id,name,age
   From Student
   Where age < 15
  Union
   Select id,name,age
   From Student
   Where Name like "%a%"
) results
order by name

46
bernd_k가 지적한 바와 같이, 정의상 UNION을 구성하는 개별 SELECT는 ORDER BY 절을 포함 할 수 없습니다. 허용되는 유일한 ORDER BY 절은 UNION의 끝에 있으며 UNION 전체에 적용되어 다음과 같은 내용을 만듭니다 xxx UNION yyy ORDER BY zzz.(xxx UNION yyy) ORDER BY zzz
Nicholas Carey

39

정렬을 UNION의 첫 번째 명령문에만 적용하려면 UNION ALL을 사용하여 하위 선택에이를 정렬 할 수 있습니다 (둘 다 Oracle에서 필요로 표시됨).

Select id,name,age FROM 
(    
 Select id,name,age
 From Student
 Where age < 15
 Order by name
)
UNION ALL
Select id,name,age
From Student
Where Name like "%a%"

또는 (Nicholas Carey의 의견을 다루고 있습니다) 상단 SELECT가 주문되고 결과가 하단 SELECT 위에 다음과 같이 표시되도록 할 수 있습니다.

Select id,name,age, 1 as rowOrder
From Student
Where age < 15
UNION
Select id,name,age, 2 as rowOrder
From Student
Where Name like "%a%"
Order by rowOrder, name

4
예. 하위 선택 결과가 정렬됩니다. select하위 선택을 참조하는 명령문 의 결과는 순서가 아닙니다 . SQL 표준에 따라 결과 순서는 명시 적 order by절을 제외하고 정의되지 않습니다 . select귀하의 예에서 첫 번째 결과는 아마도 subselect에 의해 반환 된 순서대로 결과를 반환하지만 보장되지는 않습니다. 또한 전체 결과 집합의 순서를 보장 하지는 않습니다union (표준의 규칙과 동일). 당신이 명령에 의존한다면 결국에는 물릴 것이다.
Nicholas Carey

1
@Nicholas Carey-UNION을 사용하여 처음 테스트했을 때 예상대로 작동하지 않았지만 UNION ALL (적어도 Oracle에서는)이 맨 위에있는 SELECT를 주문해야한다고 생각합니다. 그러나 올바른 순서를 보장하고 데이터베이스와 독립적이어야하는 대안을 제공했습니다.
BA TabNabber

나를 위해 작동하지 않습니다. UNION ALL을 사용하는 제품은 여전히 ​​첫 번째 주문을 유지하지 못합니다 SELECT.
Amit Chigadani

두 번째 쿼리의 문제점은 중복 레코드를 제거하지 않는다는 것입니다. 중복 레코드와 다른 값을 가질 수있는 다른 'rowOrder'열을 추가 했으므로. UNION ALL에 대한 UNION의 목적이 상실됩니다.
Amit Chigadani

1
@AmitChigadani 중복 제거는 원래의 질문의 일부는 아니지만 WHERE 절을 수정하여 고유성을 보장 할 수 있습니다. 예 : 이름이 "% a %"이고 나이> = 15 인 경우
BA TabNabber

12

다른 답변은 모두 정확하지만, 내가 붙어있는 곳은 별칭으로 주문해야한다는 것을 깨닫지 못하고 별칭이 두 선택 모두에 대해 동일한 지 확인해야한다는 점에 주목할 가치가 있다고 생각했습니다.

select 'foo'
union
select item as `foo`
from myTable
order by `foo`

첫 번째 선택에서는 작은 따옴표를 사용하지만 다른 따옴표에는 백틱을 사용하고 있습니다.

그러면 필요한 정렬이 가능합니다.


첫 번째 select에서 작은 따옴표를 사용하고 다른 것에서 backticks를 사용하여 만들고 싶은 중요한 것은 무엇입니까? 이상적으로는 일관성이 있어야합니다.
nanosoft

첫 번째 선택은 리터럴입니다. 'NAMES'와 같은 헤더입니다. 두 번째 선택은 테이블에 대한 참조입니다. 따라서 첫 번째 행에는 "NAMES"라고 표시되고 나머지 행은 테이블에서 선택한 실제 이름이됩니다. 요점은 헤더가 선택한 열의 이름과 동일한 문자열 일 수 있으며 이는 조합에서 충돌하지 않고 원하는 레이블을 사용하는 솔루션입니다.
예브게니 심킨

2
몇 가지 실험을 한 후에 ORDER BY 절에 언급 된 별칭이 SELECT 절에 언급되어 있어야합니다. 다른 열을 기준으로 정렬 할 수 없습니다. 물론 SELECT a, b, c FROM (<insert union query here>) AS x;여분의 열을 반환하지 않으려면 전체를 래핑 하여이 문제를 해결할 수 있습니다 .
Wodin

11

Order By뒤에 적용 union되므로 order by명령문 끝에 절을 추가하십시오 .

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like '%a%'
Order By name

9

Union all을 사용하면 정렬을 UNION 중 하나에 만 적용하려면 다음을 수행하십시오.

Select id,name,age
From Student
Where age < 15
Union all
Select id,name,age
From 
(
Select id,name,age
From Student
Where Name like "%a%"
Order by name
)

8

다른 답변에서 언급했듯이 LAST Union 이후 'Order by'는 Union으로 결합 된 두 데이터 세트에 적용해야합니다.

두 개의 데이터 세트가 있었지만 다른 테이블을 사용하지만 동일한 열을 사용했습니다. LAST Union이 계속 작동 한 후 '주문 기준'. 'order by'에 사용 된 열에 대해 ALIAS를 사용하면 트릭이 발생했습니다.

Select Name, Address for Employee 
Union
Select Customer_Name, Address from Customer
order by customer_name;   --Won't work

따라서 해결책은 별칭 'User_Name'을 사용하는 것입니다.

Select Name as User_Name, Address for Employee 
Union
Select Customer_Name as User_Name, Address from Customer
order by User_Name; 

-1

이것을 사용할 수 있습니다 :

Select id,name,age
From Student
Where age < 15
Union ALL
SELECT * FROM (Select id,name,age
From Student
Where Name like "%a%")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.