programing

SQL: UNION을 사용하고 특정 선택에 따라 주문하는 방법은 무엇입니까?

i4 2023. 6. 20. 21:21
반응형

SQL: UNION을 사용하고 특정 선택에 따라 주문하는 방법은 무엇입니까?

선택할 수 있는 항목은 두 가지 선택 항목:

SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1

다음과 같은 올바른 행 수를 수신했습니다.1,4,2,3.

하지만 나는 원합니다.b테이블 결과 먼저:2,1,4,3또는2,1,3,4

어떻게 해야 하나요?

(Oracle을 사용하고 있습니다.

원하는 작업:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

갱신하다

저는 당신이 두 개의 다른 테이블을 가지고 있음에도 불구하고, 당신이 ID에 가입한다는 것을 알아차렸습니다, 그것은 만약 당신이 가지고 있다면.1두 표 모두에서 한 번만 발생합니다.만약 그게 원하는 행동이라면, 당신은 계속 해야 합니다.UNION그렇지 않은 경우 다음으로 변경UNION ALL.

그래서 제가 제안한 코드로 변경하면 두 가지를 모두 얻을 수 있습니다.1그리고.2(둘 다에서)a그리고.b이 경우 제안된 코드를 다음으로 변경할 수 있습니다.

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

@Adrian 팁을 사용하여 해결책을 찾았습니다.

GROUP BY와 COUNT를 사용하고 있습니다.ORDER BY와 함께 DISTINCT를 사용하려고 했는데 "not selected expression" 오류 메시지가 표시됩니다.

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3
    UNION ALL -- changed to ALL
    SELECT id FROM b -- returns 2,1
)
GROUP BY id ORDER BY count(id);

Adrian과 이 블로그에 감사드립니다.

@아드리엔의 대답이 먹히지 않습니다.ORA-01791을 제공합니다.

정답(질문에 대한)은 다음과 같습니다.

select id
from 
 (SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
  UNION ALL
  SELECT id, 1 as ordered FROM b -- returns 2,1
  )
group by id
order by min(ordered)

설명:

  1. "UNION ALL"은 두 세트를 결합하는 것입니다.순서 필드가 다르기 때문에 두 집합이 같을 수 없기 때문에 "UNION"이 낭비됩니다.
  2. 그런 다음 "그룹화 기준"이 중복을 제거합니다.
  3. "최소 순서(주문)"는 테이블 맨의 요소를 먼저 확인하는 것입니다.

이것은 테이블 b가 더 많거나 다른 요소를 가지고 있을 때에도 테이블 a보다 모든 경우를 해결합니다.

SELECT id, 1 AS sort_order
  FROM b
UNION
SELECT id, 2 AS sort_order
  FROM a
MINUS
SELECT id, 2 AS sort_order
  FROM b
ORDER BY 2;

@아드리안의 대답은 완벽하게 적절합니다. 저는 같은 결과를 얻을 수 있는 또 다른 방법을 공유하고 싶었습니다.

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1
order by 2,1
WIITH subq as (SELECT id FROM a ORDER BY id)
SELECT id FROM subq
UNION
SELECT id FROM b

언급URL : https://stackoverflow.com/questions/6036793/sql-how-to-use-union-and-order-by-a-specific-select

반응형