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

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

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

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



답변

그냥 써

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는 전체 결과 집합에 적용됩니다


답변

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


답변

정렬을 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


답변

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

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

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

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


답변

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


답변

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
)


답변

다른 답변에서 언급했듯이 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;