계층조회
-- 계층조회
-- 카테고리, 댓글, 대댓글 등에 주로 사용
-- 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
;
훌륭한 글 감사드립니다.