MSSQL 재귀적 CTE Inline View 본문

프로그래밍/MSSQL - 예제

MSSQL 재귀적 CTE Inline View

MSSQL 에서 재귀쿼리를 사용하기 위해서는 inLineView 에 해당하는 WITH 절 구문을 이용하여 재귀쿼리를 작성해야 한다. 

 초보적인 관점에서 재귀의 사전적인 정의는 '자기 자신을 반복적으로 호출' 이라고 생각하면 된다. 재귀쿼리는 부모-자식 관계를 가지고 있는 데이터를 표현하기 위해서 사용하는 문법이다.  
업무적으로 BOM 과 같은 Level 별 상관관계(FERT-HALB-ROH)와 같은 관계를 확실하게 가지고 있다면, while 보다는 재귀쿼리를 먼저 생각해보는 것이 바람직하다. 아래의 예제는 조직도의 구성을 재귀쿼리로 구현한 예제이다.

    

SQL   |   재귀적 CTE

 
  -- 재귀적 CTE
  INSERT INTO EMP_MST VALUES('나사장', NULL, NULL)
  INSERT INTO EMP_MST VALUES('김재무', '나사장', '재무부')
  INSERT INTO EMP_MST VALUES('김부장', '김재무', '재무부')
  INSERT INTO EMP_MST VALUES('이부장', '김재무', '재무부')
  INSERT INTO EMP_MST VALUES('우대리', '이부장', '재무부')
  INSERT INTO EMP_MST VALUES('지사원', '이부장', '재무부')
  INSERT INTO EMP_MST VALUES('이영업', '나사장', '영업부')
  INSERT INTO EMP_MST VALUES('한과장', '이영업', '영업부')
  INSERT INTO EMP_MST VALUES('최정보', '나사장', '영업부')
  INSERT INTO EMP_MST VALUES('윤차장', '최정보', '영업부')
  INSERT INTO EMP_MST VALUES('이주임', '윤차장', '영업부')
  ;
  
  
  WITH CTE_RECURSIVE(EMP_NM, EMP_SUPERIOR, EMP_DEPARTMENT, EMP_LVL) AS 
  (
   SELECT EMP_NM, EMP_SUPERIOR, EMP_DEPARTMENT, 0
     FROM EMP_MST
    WHERE 1=1
	  AND EMP_SUPERIOR IS NULL
          UNION ALL
   SELECT A.EMP_NM, A.EMP_SUPERIOR, A.EMP_DEPARTMENT, B.EMP_LVL+1
     FROM EMP_MST A
          INNER JOIN CTE_RECURSIVE B ON 1=1
          AND B.EMP_NM = A.EMP_SUPERIOR
  ) 
  SELECT * 
    FROM CTE_RECURSIVE 
   ORDER BY EMP_DEPARTMENT, EMP_LVL
   ;


   참고   |   뇌를 자극하는 Sql Server 2012 기본편

 



프로그래밍/MSSQL - 예제 Related Articles

MORE