오랫만에 질문 드립니다.
특정 테이블에 아래와 같이 데이터가 입력되어 있습니다.
| LOC_ID | LOC_LEVEL | PARENT_LOC_ID | LOC_NAME |
| 1 | 1 | 대한민국 | |
| 2 | 2 | 1 | 서울 |
| 3 | 3 | 2 | 종로구 |
| 4 | 4 | 3 | 매장_1 |
| 5 | 4 | 3 | 매장_2 |
위와 같이 입력되어 있는 테이블에서 SQL 한방으로 아래와 같이 출력을 하려니 좀 애를 먹네요.
| LOC_ID | LOC_LEVEL_1_NAME | LOC_LEVEL_2_NAME | LOC_LEVEL_3_NAME | LOC_LEVEL_4_NAME |
| 1 | 대한민국 | |||
| 2 | 대한민국 | 서울 | ||
| 3 | 대한민국 | 서울 | 종로구 | |
| 4 | 대한민국 | 서울 | 종로구 | 매장_1 |
| 5 | 대한민국 | 서울 | 종로구 | 매장_2 |
Oracle에서는 Connect By를 사용하면 어떻게 될것 같은데 MySQL 5.7 버전이라 쉽지 않네요..ㅜㅜ
전체 건수는 약 20만건 정도됩니다.
고수님들의 고견 부탁드립니다.
WITH t AS
(
SELECT 1 loc_id, 1 loc_level, null parent_loc_id, '대한민국' loc_name
UNION ALL SELECT 2, 2, 1, '서울'
UNION ALL SELECT 3, 3, 2, '종로구'
UNION ALL SELECT 4, 4, 3, '매장_1'
UNION ALL SELECT 5, 4, 3, '매장_2'
)
SELECT t1.loc_id loc_id_lv1
, null loc_id_lv2
, null loc_id_lv3
, null loc_id_lv4
, t1.loc_name loc_name_lv1
, null loc_name_lv2
, null loc_name_lv3
, null loc_name_lv4
FROM t t1
WHERE t1.loc_level = 1
UNION ALL
SELECT t1.loc_id loc_id_lv1
, t2.loc_id loc_id_lv2
, null loc_id_lv3
, null loc_id_lv4
, t1.loc_name loc_name_lv1
, t2.loc_name loc_name_lv2
, null loc_name_lv3
, null loc_name_lv4
FROM t t1
INNER JOIN t t2 ON t2.parent_loc_id = t1.loc_id
WHERE t1.loc_level = 1
UNION ALL
SELECT t1.loc_id loc_id_lv1
, t2.loc_id loc_id_lv2
, t3.loc_id loc_id_lv3
, null loc_id_lv4
, t1.loc_name loc_name_lv1
, t2.loc_name loc_name_lv2
, t3.loc_name loc_name_lv3
, null loc_name_lv4
FROM t t1
INNER JOIN t t2 ON t2.parent_loc_id = t1.loc_id
INNER JOIN t t3 ON t3.parent_loc_id = t2.loc_id
WHERE t1.loc_level = 1
UNION ALL
SELECT t1.loc_id loc_id_lv1
, t2.loc_id loc_id_lv2
, t3.loc_id loc_id_lv3
, t4.loc_id loc_id_lv4
, t1.loc_name loc_name_lv1
, t2.loc_name loc_name_lv2
, t3.loc_name loc_name_lv3
, t4.loc_name loc_name_lv4
FROM t t1
INNER JOIN t t2 ON t2.parent_loc_id = t1.loc_id
INNER JOIN t t3 ON t3.parent_loc_id = t2.loc_id
INNER JOIN t t4 ON t4.parent_loc_id = t3.loc_id
WHERE t1.loc_level = 1
ORDER BY 1, 2, 3, 4
;