[ Oracle ] start with와 connect by를 사용해 부모 노드 확인하기
본문으로
안녕하세요. 녀기입니다.
죽지도 않고 또 왔습니다.
연습하다가
죄다 모르는 것 투성이라 계속 포스팅하네요!
이래서 사람은 연습이 중요한가 봅니다.
이번 포스팅은
부모 노드를 찾아가는 것인데,
뭐 여러 경우가 있습니다.
일단 제가 아는 것은
가장 상위 직급은 무엇인가?
요정도?
(자격증 셤에도 나왔던 것 같은데...)
분명히 공부할 때는 그렇구나!
하고 넘어갔었는데,
사용하려고 하니 기억 안 나더군요....
그나마 다행인건,
그런 것을 공부했었다!!
가 기억이 나서
검색을 할 수 있다는 점!!!
(오늘도 빛나는 교수님의 명언....)
다시는 잊지 않도록
기록을 남기겠습니다.
들어가시죠!!
START WITH, CONNECT BY
select n,
case when level=1 then 'Root'
when level=(
select max(level)
from bst
start with p is null
connect by prior n=p
) then 'Leaf'
else 'Inner'
end
from bst
start with p is null
connect by prior n=p
order by n asc
n이라는 컬럼과 p 라는 컬럼이 있습니다.
n 컬럼의 부모 노드를 표시해 놓은 것이 p 컬럼입니다.
가장 최상위 부모는 p 컬럼의 값이 null 입니다.
n | p |
1 | 2 |
3 | 2 |
6 | 8 |
9 | 8 |
2 | 5 |
8 | 5 |
5 | null |
n이 1인 데이터의 부모를 거슬러 올라가면
1 >> 2 >> 5
가 될 것입니다.
각 절을 하나씩 살펴 보면
- start_with : 계층 구조를 지칭할 데이터를 선언합니다.
- connect by : 계층 구조를 만들기 위해, 행 사이를 연결합니다.
start_with p = nulll
라고 조건을 설정하면,
p 값이 null인 데이터를 가장 계층이 높은 데이터로 취급하겠다는 것입니다.
그리고
connect by prior n=p
라고 조건을 설정해, n과 p가 같은 값들로 계층 구조를 만들겠다는 뜻입니다.
이렇게 계층 구조를 만들고 나면
'level' 이라는 컬럼이 생성되는데,
가장 최상위 값에 '1'이 부여됩니다.
위 코드를 실행하면
위와 같은 결과가 도출되는 것을 확인할 수 있습니다~~
진짜 머리 터지겠네요.
sql 공부가 더 중요한 줄 알았으면
파이썬 공부 안 하고 sql만 했을텐데.....
시간만 버린 느낌....
취직해서도 공부해야 하는 건 똑같겠지만,
이렇게 불투명한 상태에서 언제까지 해야할지....
(정규직으로 돈 벌고 싶다.)
갑자기 우울해졌으니 도망가겠습니다.
여러분은 힘내셨으면 좋겠습니다~