START WITH CONNECT 쿼리를 일반쿼리로 만들기 궁금합니다. 0 4 4,013

by 엘시아 [SQL Query] START WITH CONNECT BY PRIOR [2016.05.31 13:07:43]


Advanced SQL강좌에 계층쿼리에서 예제 쿼리가 아래처럼 나와있는데,
아래쿼리 결과값을 계층쿼리를 안쓰고 만들고 싶은데, 방법이 궁금합니다.
복잡해보여요 ...;;
 
SELECT LEVEL, empno, ename, mgr
  FROM emp
 START WITH job = 'PRESIDENT'
CONNECT BY PRIOR  empno = mgr;
by 우리집아찌 [2016.05.31 13:55:44]

테이블 구조가 계층이면 일반쿼리 안될것 같은데요.

저는 뷰로 만들어서 제공합니다만..


by 마농 [2016.05.31 14:30:24]

일반쿼리라는 표현이 어디까지를 의미하는지?
계층 구조 테이블은 계층 쿼리 안쓸 수는 없죠.
다만 각 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
;

 


by 마농 [2016.05.31 14:57:27]

일반쿼리로 만들어 봤습니다.

계층의 깊이가 깊어지면 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
;

 


by 엘시아 [2016.05.31 17:45:39]

자세한 설명 감사드립니다. 위에 댓글보고 더 공부할께요 ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입