계층조회

GW·2023년 8월 17일

계층조회

-- 계층조회
-- 카테고리, 댓글, 대댓글 등에 주로 사용
-- SELECT 
--   FROM
--   START WITH CONDITION
-- CONNECT BY PRIOR CONDITION 
 SELECT LEVEL --계층의 단계를 LEVEL이라고 한다. 
      , E.*
   FROM EMPLOYEES E
  START WITH EMPLOYEE_ID = 104
CONNECT BY PRIOR MANAGER_ID = EMPLOYEE_ID 
-- 104번 사원의 상사번호는 누군가의 사원번호다. = 104번 사원의 모든 상사를 조회한다.
;

-- 101번 사원의 모든 부하 직원을 계층 조회해라
 SELECT LEVEL 
      , E.*
   FROM EMPLOYEES E
  START WITH EMPLOYEE_ID=101
CONNECT BY PRIOR EMPLOYEE_ID=MANAGER_ID
-- 101번 사원의 사원번호는 누군가의 상사번호다. = 101번 사원의 모든 부하직원을 조회한다. 
;

1번부터 100번까지 있다는 가정하에
20~40번 조회 방법

-- EMPLOYEES 테이블에서 11번째 ROW 부터 20번째 ROW까지만 조회.
-- WHERE에 ROWNUM을 필터링 할 경우 반드시 1부터 필터링 해야한다.
-- SELECT 쿼리의 결과를 만드는 과정을 FETCH라고 하는데 
-- FETCH 하는 과정에서 ROWNUM이 1씩 증가되기 때문에, 반드시 1부터 필터링을 해야하며
-- 1보다 큰 수로 필터링을 할 경우 무한반복의 가능이 있기에 DB에서 처리 해주지 못한다.

--1. 1부터 20번째 ROW 까지만 조회해서 INLINE VIEW로 변경.

SELECT
SELECT ROWNUM RNUM
     , E.*
  FROM EMPLOYEES E
 WHERE ROWNUM <=20
;
--2. INLINE VIEW에서 11번째부터 조회.
SELECT *
  FROM (SELECT ROWNUM RNUM
     		 , E.*
  		  FROM EMPLOYEES E
         WHERE ROWNUM <=20)E
 WHERE RNUM>=11
;

-- 연봉기준으로 오름차순 정렬해서
-- 20번째 ROW부터 40번쨰 ROW까지만 조회
SELECT *
  FROM (SELECT ROWNUM RNUM
      	     , E.*
     	  FROM (SELECT E.*
	 		      FROM EMPLOYEES E
	 		     ORDER BY SALARY)E
	 	 WHERE ROWNUM<=40)E
 WHERE E.RNUM>=20
; 

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

훌륭한 글 감사드립니다.

답글 달기