by 엘시아 [SQL Query] START WITH CONNECT BY PRIOR [2016.05.31 13:07:43]
SELECT
LEVEL
, empno, ename, mgr
FROM
emp
START
WITH
job =
'PRESIDENT'
CONNECT
BY
PRIOR
empno = mgr;
일반쿼리라는 표현이 어디까지를 의미하는지?
계층 구조 테이블은 계층 쿼리 안쓸 수는 없죠.
다만 각 DBMS 마다 계층쿼리 사용 구문이 다를 수는 있죠.
계층 쿼리 구문을 지원하지 않는 DB도 다수입니다.
오라클에서는 WITH 구문을 이용한 재귀쿼리를 11G R2 부터 지원합니다.
MSSQL 에서도 동일한 방식으로 사용합니다.
http://www.gurubee.net/lecture/2223
-- 11G Recursive SQL -- WITH t1(lv, empno, ename, mgr) AS ( SELECT 1 lv , empno, ename, mgr FROM emp WHERE job = 'PRESIDENT' UNION ALL SELECT p.lv + 1 lv , c.empno, c.ename, c.mgr FROM t1 p , emp c WHERE p.empno = c.mgr ) SEARCH DEPTH FIRST BY empno SET idx SELECT * FROM t1 ;
일반쿼리로 만들어 봤습니다.
계층의 깊이가 깊어지면 Union 구문이 추가되어야 합니다.
최대 깊이를 제한 설정하고 쿼리문을 만드시면 되겠네요.
SELECT 1 lv , empno, ename, mgr , ''||empno path FROM emp WHERE job = 'PRESIDENT' UNION ALL SELECT 2 lv , e2.empno, e2.ename, e2.mgr , e1.empno||'-'||e2.empno path FROM emp e1 , emp e2 WHERE e1.job = 'PRESIDENT' AND e1.empno = e2.mgr UNION ALL SELECT 3 lv , e3.empno, e3.ename, e3.mgr , e1.empno||'-'||e2.empno||'-'||e3.empno path FROM emp e1 , emp e2 , emp e3 WHERE e1.job = 'PRESIDENT' AND e1.empno = e2.mgr AND e2.empno = e3.mgr UNION ALL SELECT 4 lv , e4.empno, e4.ename, e4.mgr , e1.empno||'-'||e2.empno||'-'||e3.empno||'-'||e4.empno path FROM emp e1 , emp e2 , emp e3 , emp e4 WHERE e1.job = 'PRESIDENT' AND e1.empno = e2.mgr AND e2.empno = e3.mgr AND e3.empno = e4.mgr ORDER BY path ;