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.