개발/데이터베이스

mssql 재귀쿼리 REPLICATE

깉니 2023. 10. 25. 10:59

*전체적인 구조

WITH TEMP AS

(

 SELECT 컬럼

 FROM 테이블명

UNION ALL

 SELECT 컬럼

 FROM 테이블명

 INNER JOIN TEMP

  ON 테이블명.컬럼 = TEMP.컬럼

)

SELECT * FROM TEMP(재귀쿼리)

 

-재귀쿼리 사용을 위해서 WITH절 밖에서 사용해야하므로 SELECT...절을 통해서 재귀쿼리를 조회해서 사용했음

  • WITH RECURSIVE 규칙
    • RECURSIVE를 사용할 때는 서브 쿼리내에서 UNION (ALL) 이 사용되어야 한다.
    • 한 개 이상의 Non-Recursive 문장이 포함되어 있어야 한다. (첫번째 루프에서만 실행됨, anchor 역할임. 이것 미만의 계층구조로 연결되어 있는 것들 다 나옴)
    • 반복되는 Recursive문은 반드시 정지조건(where) 이 필요하다. (반복)
    • select시에 convert사용은 앵커멤버와 재귀맴버의 유형을 일치시켜주기 위해서

REPLICATE(반복 문자, 문자 반복 횟수)

CASE WHEN LVL = 0 THEN A.MENU_NM ELSE REPLICATE(' ', (A.LVL)) + '└ ' + A.MENU_NM END

-> lvl이 0이면 메뉴이름이 그대로이고 그렇지 않은경우 반복문자(공백)를 반복횟수(레벨)만큼넣고...

 

참조 : https://highjune.dev/database/mysql_recursion_hierachy_query/

 

(mysql) 재귀쿼리로 계층구조 데이터 표현(id - varchar)

재귀쿼리로 계층구조 데이터 표현하기(id(varchar)로) id에 varchar로 계층구조를 담아서 하지 않고 integer로 설계해서 표현하는 설계방법은 여기로. mysql 기준으로 설명 (오라클은 CONNECT BY PRIOR, START WIT

highjune.dev

참조2 : https://nive.tistory.com/149

 

재귀쿼리

회사에는 여러부서가 있다. 그리고 그안에 또 팀에 있고...이들을 계층형으로 보고싶을때, 어느팀이 어느 부서에 속해있는지를 알고싶은 경우가 있다. 또한 각 최상위 부서별로 무언가에 대한

nive.tistory.com