2016년 2월 16일 화요일

[SQL 교육] 계층형 쿼리(Connect by, Prior)

[SQL 교육] 계층형 쿼리(Connect by, Prior)

(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)
※ Oracle DB를 사용합니다.

계층형 쿼리에서 Connect by 절을 배우는데 prior를 어느쪽 열에 붙여야 하는지 이해가 겨우 되어서 잊기 전에 정리한다.

employees 테이블에는 employee_id, manager_id 열이 존재한다.

--모든 사원의 관계도를 출력하라.
select employee_id,
lpad(' ', 3*(level-1))||first_name||' '||last_name, level
from employees
start with manager_id is null
connect by prior employee_id=manager_id
order siblings by first_name;
--siblings by절에는 열별칭 사용 불가



위의 sql문에서 'start with manager_id is null'이라는 것은 employees 테이블에서 사장은 manager가 없기 때문에 null이다. 그래서 사장부터 시작하겠다는 의미이다.

그러고서 'connect by prior employee_id=manager_id'가 시작점부터 하위계층을 연결시켜주는 부분인데, employee_id에 prior가 붙은 의미는
-> start with에서 시작점 행을 출력했고, 이제 connect by에서 다음 행을 선택을 할 거다. 이때, 다음 행을 기준으로 manager_id가 이전 행의 employee_id와 같은 것을 선택해라.
라는 것이다.

즉, connect by는 다음에 선택 될 행을 기준으로 하고있다. 그래서 prior가 의미하는 것은 현재 출력되는 행을 의미한다.
그래서 'connect by prior employee_id=manager_id'는 현재 출력된 행의 employee_id와 다음의 선택 될 행의 manager_id가 같은 행들을 선택하라는 것이다.



댓글 없음:

댓글 쓰기