programing

SQL에서 union과 함께 주문하려면 어떻게 해야 합니까?

bestprogram 2023. 4. 22. 10:57

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

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%"

아니면 (니컬러스 캐리의 발언에 대해) 상위를 보장해도 좋다.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

다른 답변에서도 언급했듯이ORDER BY마지막으로 UNION결합으로 결합된 두 데이터 세트에 모두 적용해야 합니다.

테이블은 다르지만 열은 같은 두 개의 데이터 세트를 사용했습니다. ORDER BY마지막으로UNION여전히 효과가 없었습니다.

에서 사용되는 컬럼의 에일리어스 사용ORDER BY절이 효과가 있었다.

SELECT Name, Address FROM Employee 
UNION
SELECT Customer_Name, Address FROM Customer
ORDER BY customer_name;   --Won't work

해결책은 이 별칭을 사용하는 것이었습니다.User_Name, 이하에 나타냅니다.

SELECT Name AS User_Name, Address FROM Employee 
UNION
SELECT Customer_Name AS User_Name, Address FROM Customer
ORDER BY User_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사용한다면UNION ALL:

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
)

이전 토픽에 추가하기 위해 ROW_NUMBER(MS SQL 사용)를 사용했습니다.이것에 의해, UNION내의 정렬(주문)이 가능하게 됩니다.그래서 @BATABNabber의 아이디어를 사용하여 유니언의 각 반을 분리하고 모든 것을 선택으로 포장하는 @Wodin을 사용하여 다음과 같은 것을 얻었습니다.

Select Id, Name, Age from
(
Select Id, Name, Age, 1 as Mainsort
 , ROW_NUMBER() over (order by age) as RowNumber
From Student
Where Age < 15

Union

Select Id, Name, Age, 2 as Mainsort
 , ROW_NUMBER() over (Order by Name) as RowNumber
From Student
Where Name like '%a%'
) as x
Order by Mainsort, RowNumber

따라서 주문 기준을 조정하거나 생략하고 적합하다고 판단되는 내림차순을 추가합니다.

정렬할 데이터를 하위 식별할 수 있는 열을 쿼리에 추가합니다.

다음 예제에서는 에서 Common Table Expression을 사용하여 표시된 내용을 선택하고 CTE 상의 특정 그룹에 배치한 후 다음을 수행합니다.union그 두 그룹에서 로부터AllStudents.

그러면 최종 선택 항목이 정렬됩니다.AllStudents 에 의해SortIndex첫 번째 컬럼과 다음 컬럼으로name예를 들어 다음과 같습니다.

WITH Juveniles as
(
      Select 1 as [SortIndex], id,name,age From Student
      Where age < 15
),

AStudents as
(
      Select 2 as [SortIndex], id,name,age From Student
      Where Name like "%a%" 
),

AllStudents as
(
      select * from Juveniles
      union 
      select * from AStudents
)

select * from AllStudents
sort by [SortIndex], name;

요약하면, 우선 그룹별로 정렬되고, 그 후에 그룹 내 이름으로 정렬되는 모든 학생을 얻을 수 있습니다.

ORDER BY 또는 LIMIT 절을 개별 SELECT에 적용하려면 SELECT를 괄호 안에 넣고 해당 절을 괄호 안에 넣습니다.

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

사용 가능:

Select id,name,age
From Student
Where age < 15
Union ALL
SELECT * FROM (Select id,name,age
From Student
Where Name like "%a%")

TOP X를 사용하면 어떨까요?

SELECT pass1.* FROM 
 (SELECT TOP 2000000 tblA.ID, tblA.CustomerName 
  FROM TABLE_A AS tblA ORDER BY 2) AS pass1
UNION ALL 
SELECT pass2.* FROM 
  (SELECT TOP 2000000 tblB.ID, tblB.CustomerName 
   FROM TABLE_B AS tblB ORDER BY 2) AS pass2

TOP 2000000은 모든 데이터를 캡처할 수 있는 임의의 수치입니다.요건에 따라 조정합니다.

언급URL : https://stackoverflow.com/questions/4715820/how-to-order-by-with-union-in-sql