본문 바로가기

개발/Oracle

[TIP] 계층 쿼리에 조건을 더하자(START WITH)

계층형 쿼리는 보통 메뉴 혹은 조직을 관리하는 데이터에서 많이 사용된다.

형식은 보통


SELECT ...

FROM ...

WHERE ...

START WITH ... -> 시작 조건

CONNECT BY ... -> 연결 조건

ORDER SIBLINGS BY ...


요렇게 된다. 여기서 계층 쿼리 구성이 된 상태에서 ORDER BY를 주면 데이터들이 그 데이터들 기준으로 정렬이 되므로 계층 구조를 유지한 상태에서 끝에 'ORDER SIBLINGS BY 정렬 조건' 요렇게 주면 원하는 형태의 데이터를 얻을 수 있다.


그런데 종종 데이터를 얻을 때 


마케팅

...

경영지원

...

영업부

영업1부

...

영업2부

...

영업3부


이런 식의 계층 구조에서 영업부 전체가 분사해서 새로 회사를 차린다고 가정을 해보면 기존 데이터들 때문에 삭제할 수는 없고 실제 조직도에서는 보여지면 안되니 DISPLAY_YN = 'N' 이렇게 관리를 하게 될텐데 관리 프로그램에서는 가장 상위의 영업부만 'N' 으로 데이터를 바꾸면 하위는 알아서 안나오도록 원하게 될 것이다.


이 때, 상위 데이터부터 시작해서 그 하위까지 데이터가 안나오도록 원한다면


SELECT ...

FROM ...

WHERE ...

START WITH ... -> 시작 조건

AND DISPLAY_YN = 'Y'

CONNECT BY ... -> 연결 조건

AND DISPLAY_YN = 'Y'

ORDER SIBLINGS BY ...


위의 굵은 글씨처럼 두 조건을 추가해주면 된다. 시작 조건에서 가장 상위의 영업부가 제외되고 순환관계 조인을 하면서 영업부와 관계된 하위 데이터들은 알아서 필터링 되서 나오게 된다.