녕녀기의 실험일지

[ Oracle ] start with와 connect by를 사용해 부모 노드 확인하기 본문

-- Data --/- SQL -

[ Oracle ] start with와 connect by를 사용해 부모 노드 확인하기

녕녀기 2024. 2. 22. 15:53

본문으로

안녕하세요. 녀기입니다.

 

죽지도 않고 또 왔습니다.

 

연습하다가

 

죄다 모르는 것 투성이라 계속 포스팅하네요!

 

이래서 사람은 연습이 중요한가 봅니다.

 

 

 

이번 포스팅은

 

부모 노드를 찾아가는 것인데,

 

뭐 여러 경우가 있습니다.

 

일단 제가 아는 것은

 

가장 상위 직급은 무엇인가?

 

요정도?

 

(자격증 셤에도 나왔던 것 같은데...)

 

 

 

분명히 공부할 때는 그렇구나!

 

하고 넘어갔었는데,

 

사용하려고 하니 기억 안 나더군요....

 

그나마 다행인건,

 

그런 것을 공부했었다!!

 

가 기억이 나서

 

검색을 할 수 있다는 점!!!

 

(오늘도 빛나는 교수님의 명언....)

 

다시는 잊지 않도록

 

기록을 남기겠습니다.

 

들어가시죠!!


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만 했을텐데.....

 

시간만 버린 느낌....

 

취직해서도 공부해야 하는 건 똑같겠지만,

 

이렇게 불투명한 상태에서 언제까지 해야할지....

 

(정규직으로 돈 벌고 싶다.)

 

갑자기 우울해졌으니 도망가겠습니다.

 

여러분은 힘내셨으면 좋겠습니다~

Comments