오라클 계층쿼리 짜는데 어렵네요 ㅠ 0 3 959

by 십이장기 [SQL Query] [2020.11.19 15:12:00]


데이터로는

 

 

테이블 A

ID   PC방이름    상위PC방ID         

1    PC방1        NULL

2     PC방2      1

3    PC방3      2

4     PC방4     1

5    PC방5     2

6   PC방6        NULL

7   PC방7       6

8   PC방8       7

 

이런식으로 데이터가있으면

 

계층형 쿼리로 사용하여

 

PC방1   PC방2    PC방3

PC방1   PC방4    PC방5

PC방6   PC방7    PC방8

 

이렇게 상위코드가 NULL이면 1레벨 , 1레벨을 상위코드로 가지고있으면 2레벨, 2레벨을 상위코드로 가지고있으면 3레벨로 바라보고

 

저렇게 각각의 계층별로 데이터를 나타내고싶습니다 어떻게하면 좋을까요?

by 랑에1 [2020.11.19 15:46:02]
WITH T(ID, PC방이름, 상위PC방ID) AS (
SELECT '1', 'PC방1', NULL FROM DUAL UNION ALL 
SELECT '2', 'PC방2', '1' FROM DUAL UNION ALL
SELECT '3', 'PC방3', '2' FROM DUAL UNION ALL
SELECT '4', 'PC방4', '1' FROM DUAL UNION ALL
SELECT '5', 'PC방5', '4' FROM DUAL UNION ALL
SELECT '6', 'PC방6', NULL FROM DUAL UNION ALL
SELECT '7', 'PC방7', '6' FROM DUAL UNION ALL
SELECT '8', 'PC방8', '7' FROM DUAL
)

SELECT SUBSTR(SYS_CONNECT_BY_PATH(PC방이름, ' '), 2) path     	     
FROM T 
WHERE CONNECT_BY_ISLEAF = 1
START WITH 상위PC방ID IS NULL 
CONNECT BY PRIOR ID = 상위PC방ID

-- http://www.gurubee.net/lecture/1903 강좌 참고하시면 잘 나와있습니다.

by 십이장기 [2020.11.19 15:48:24]

아 혹시 

PC방1   PC방2    PC방3

PC방1   PC방4    PC방5

PC방6   PC방7    PC방8

 

아 혹시 이렇게 나오는게 한 문자열이 아니라 각각의 레코드로 나오게하고싶습니다 ㅠ


by 랑에1 [2020.11.19 17:12:19]
-- 3단계 계층이라고 치면..
SELECT path 
     , REGEXP_SUBSTR(path, '[^ ]+', 1, 1) col1  
     , REGEXP_SUBSTR(path, '[^ ]+', 1, 2) col2
     , REGEXP_SUBSTR(path, '[^ ]+', 1, 3) col3
FROM 
(
	SELECT SUBSTR(SYS_CONNECT_BY_PATH(PC방이름, ' '), 2) path         
	FROM T 
	WHERE CONNECT_BY_ISLEAF = 1
	START WITH 상위PC방ID IS NULL
	CONNECT BY PRIOR ID = 상위PC방ID
)

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입