조직구조나 BOM 과 같이 계층구조로 된 데이터에 대하여 쉽게 쿼리를 구현할 수 있도록 해주는 것이 CTE, create table test1 (mycode varchar(10), uppercode varchar(10)) insert into test1 (mycode, uppercode) select 1, 2 union all select 2, 3 union all select 3, 4 union all select 4, null insert into test1 (mycode, uppercode) select 10, 20 union all select 20, 30 union all select 30, 4 insert into test1 (mycode, uppercode) select 5, 2 go as ( select uppercode, mycode, 0, mycode from test1 where uppercode = 4 union all select a.uppercode, a.mycode, b.levelno+1, b.groupcode from test1 a join cteTest b on a.uppercode = b.mycode ) select * from cteTest order by groupcode, levelno go
그중에서도 재귀적 CTE 이다.
with cteTest(uppercode, mycode, levelno, groupcode)
with cteTest(uppercode, mycode, levelno, groupcode) as ( select uppercode, mycode, 0, mycode from test1 where uppercode = 4 union all select a.uppercode, a.mycode, b.levelno+1, b.groupcode from test1 a join cteTest b on a.uppercode = b.mycode ) select a.groupcode as rootcode, a.mycode as leafcode from cteTest a where a.levelno = (select MAX(levelno) from cteTest b where a.groupcode = b.groupcode) |
마지막 쿼리는 계층구조의 최하위 레벨과 최상위코드(상위코드가 NULL) + 1인 레벨을 연결한 예이다.
(조직구조의 최하위 조직이 속한 최상위 조직을 알고자 하는 경우)
'데이터베이스' 카테고리의 다른 글
MS SQL 에서 OpenQuery로 실행 시 ORA-00936 오류 (0) | 2011.08.24 |
---|---|
Oracle Client 다운로드 페이지 (0) | 2011.08.24 |
SQL 서버 2008 SSMS 로그인시 암호저장이 잘 안될때 (0) | 2011.08.19 |
SQL서버 ROLLUP 사용 (0) | 2011.08.02 |
SQL서버 에서 Oracle 연결된 서버 OpenQuery numeric 오류 (0) | 2011.06.21 |