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
'programing' 카테고리의 다른 글
Azure DevOps에서 슬래시가 있는 지점 이름을 얻는 방법 (0) | 2023.04.22 |
---|---|
"NODE_ENV"는 내부 또는 외부 명령어, 작동 가능한 명령어 또는 배치 파일로 인식되지 않습니다. (0) | 2023.04.22 |
GCC에서 "문자열 상수에서 "char*"로 사용되지 않는 변환" 경고를 제거하는 방법 (0) | 2023.04.22 |
url 내의 double excape sequence : 요구 필터링 모듈은 이중 이스케이프 시퀀스를 포함하는 요구를 거부하도록 설정됩니다. (0) | 2023.04.22 |
matplotlib 범례 추가 (0) | 2023.04.22 |