DA Study/TIL

[TIL] UNION 테이블 병합 시 각 테이블 별 정렬하기 # MySQL # SQL

harrym8n 2025. 1. 31. 11:17

HackerRank Intermediate - The PADS
👉 문제 바로가기(HackerRank)

-- 풀이1. 테이블 병합하여 한번에 출력
SELECT col 
FROM (
    SELECT CONCAT(NAME, '(', LEFT(Occupation,1), ')') AS col, 
           1 AS sort_order, 
           NAME AS sort_value, 
           NULL AS cnt, 
           NULL AS occ
    FROM OCCUPATIONS

    UNION ALL

    SELECT CONCAT('There are a total of ', COUNT(*), ' ', LOWER(Occupation), 's.') AS col, 
           2 AS sort_order, 
           NULL AS sort_value, 
           COUNT(*) AS cnt, 
           Occupation AS occ
    FROM OCCUPATIONS
    GROUP BY Occupation
) AS combined_result
ORDER BY sort_order, cnt, occ, sort_value;


-- 풀이2. 테이블 병합하지 않고 각자 출력
SELECT Name, CONCAT(NAME,'(',LEFT(Occupation,1),')') as col
FROM OCCUPATIONS
ORDER BY col;

SELECT CONCAT('There are a total of ',COUNT(*),' ', LOWER(Occupation),'s.') as col
FROM OCCUPATIONS
GROUP BY Occupation
ORDER BY COUNT(*), Occupation;

[문제 상황]

  • 서로 다른 테이블의 결과를 한번에 출력해야 한다.
  • 각 테이블별 정렬이 필요한데 Union All을 통해 출력하면 테이블별로 정렬 기준을 적용시킬 수 없다.(서브쿼리 내의 정렬은 적용X)
  • UNION ALL 이후 최종 정렬을 지정하지 않으면, 데이터베이스 엔진이 결과를 예측할 수 없는 순서로 반환할 수 있음

[해결]
방법 1

  • 각 테이블 별로 정렬 순서를 적용할 테이블 순서를 나타내는 컬럼과, 정렬 기준이 되는 컬럼을 생성한다.
  • UNION 하기 위해서는 각 테이블의 컬럼명과 개수가 똑같아야 하므로, 정렬 기준이 적용 되지 않는 테이블에는 정렬 기준으로 생성한 컬럼의 컬럼값을 NULL로 입력한다.
  • UNION 수행
  • 최종 정렬로 생성한 정렬 순서와 정렬 기준을 적용시킨다.

방법 2

  • 각 테이블의 정렬까지 완료하여 테이블 별로 원하는 결과를 출력하는 쿼리를 작성한다.
  • 각 쿼리 마지막에 세미콜론(;)을 붙여 각 쿼리가 개별적으로 실행되도록 한다.
  • 테이블이 병합되지 않은채로 각각의 쿼리의 결과값이 출력된다.

[회고]

  • UNION을 통해 하나의 테이블로 병합할 때, 컬럼명이 같아야한다는 것을 알게 되었다.
  • UNION을 사용할 때, 병합하는 각 테이블 별로 결과를 정렬하려면 정렬 순서 컬럼, 정렬 기준 컬럼을 추가로 생성해서 최종 정렬 ORDER BY절에 작성하여 원하는 결과를 얻을 수 있음을 알게 되었다.
  • 각 쿼리를 합치지 않고 결과를 출력하려면 각 쿼리 끝에 세미콜론(;)으로 맺어주면 된다는 사실을 알게 되었다.