사용자 도구

사이트 도구


기술문서:레퍼런스:쿼리:응용:recursive_query

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
기술문서:레퍼런스:쿼리:응용:recursive_query [2025/04/14 17:47]
carlito76
기술문서:레퍼런스:쿼리:응용:recursive_query [2025/11/27 12:05] (현재)
carlito76
줄 6: 줄 6:
 ====== Recursive Query ====== ====== Recursive Query ======
  
-^  물리명  ^  논리명  ^  타입  ^  KEY  ^ +<note tip> 
-| 코드ID | cd_id | 문자 | PK | +최소 지원 버전은 약간의 차이가 있을 수 있습니다. 
-| 코드명 | cd_nm | 문자 | | +</note>
-| 부모 코드ID | parent_cd_id | 문자 | | +
-| 정렬 순서 | sort_order | 숫자 | |+
  
 +===== 테이블 명세 =====
 +^  물리명  ^  논리명  ^  타입  ^  길이  ^  KEY  ^
 +| 코드ID | cd_id | 문자형 | 100 | PK |
 +| 코드명 | cd_nm | 문자형 | 100 | |
 +| 부모 코드ID | parent_cd_id | 문자형 | 100 | |
 +| 정렬 순서 | sort_order | 숫자형 | | |
 +
 +===== SQL 스크립트 =====
 <sxh sql; gutter: true; title: DDL;> <sxh sql; gutter: true; title: DDL;>
--- MySQL/MariaDB & MSSQL & PostgreSQL 
-CREATE TABLE ex_recursive ( 
- cd_id VARCHAR(100) NOT NULL PRIMARY KEY, 
- cd_nm VARCHAR(100) NOT NULL, 
- parent_cd_id VARCHAR(100), 
- sort_order BIGINT NOT NULL 
-); 
- 
--- Oracle/Tibero 
 CREATE TABLE ex_recursive ( CREATE TABLE ex_recursive (
  cd_id VARCHAR(100) NOT NULL PRIMARY KEY,  cd_id VARCHAR(100) NOT NULL PRIMARY KEY,
  cd_nm VARCHAR(100) NOT NULL,  cd_nm VARCHAR(100) NOT NULL,
  parent_cd_id VARCHAR(100),  parent_cd_id VARCHAR(100),
- sort_order NUMBER NOT NULL+ sort_order INT NOT NULL
 ); );
 </sxh> </sxh>
줄 56: 줄 53:
 ===== MySQL/MariaDB ===== ===== MySQL/MariaDB =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- MySQL 8.0 이상/MariaDB 10.2.2 이상+/* 
 + MySQL 8.0.1 이상/MariaDB 10.2.2 이상 
 +*/
 WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS ( WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS (
  SELECT  SELECT
줄 65: 줄 64:
  , 1  , 1
  , cd_nm  , cd_nm
- , CAST(LPAD(CAST(sort_order AS CHAR), 5, '0') AS CHAR(255)) -- 정렬 순서 5자리/43단계까지 지원+ , CAST(LPAD(CAST(sort_order AS CHAR), 3, '0') AS CHAR(255)) -- 정렬 순서 3자리(999)/64단계까지 지원 
 + -- , CAST(LPAD(CAST(sort_order AS CHAR), 4, '0') AS CHAR(255)) -- 정렬 순서 4자리(9999)/51단계까지 지원 
 + -- , CAST(LPAD(CAST(sort_order AS CHAR), 5, '0') AS CHAR(255)) -- 정렬 순서 5자리(99999)/42단계까지 지원
  FROM  FROM
  ex_recursive  ex_recursive
줄 78: 줄 79:
  , b.cd_lvl + 1  , b.cd_lvl + 1
  , CONCAT(b.cd_nm_depth, ' > ', a.cd_nm)  , CONCAT(b.cd_nm_depth, ' > ', a.cd_nm)
- , CAST(CONCAT(b.seq, ':', LPAD(CAST(a.sort_order AS CHAR), 5, '0')) AS CHAR(255)) -- 정렬 순서 5자리/43단계까지 지원+ , CAST(CONCAT(b.seq, ':', LPAD(CAST(a.sort_order AS CHAR), 3, '0')) AS CHAR(255)) -- 정렬 순서 3자리(999)/64단계까지 지원 
 + -- , CAST(CONCAT(b.seq, ':', LPAD(CAST(a.sort_order AS CHAR), 4, '0')) AS CHAR(255)) -- 정렬 순서 4자리(9999)/51단계까지 지원 
 + -- , CAST(CONCAT(b.seq, ':', LPAD(CAST(a.sort_order AS CHAR), 5, '0')) AS CHAR(255)) -- 정렬 순서 5자리(99999)/42단계까지 지원
  FROM  FROM
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SELECT SELECT
줄 95: 줄 98:
 ===== MSSQL ===== ===== MSSQL =====
 <sxh sql; gutter: true;> <sxh sql; gutter: true;>
--- MSSQL 2005 이상+/* 
 + MSSQL 2005 이상 
 +*/
 WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS ( WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS (
  SELECT  SELECT
줄 104: 줄 109:
  , 1  , 1
  , CAST(cd_nm AS NVARCHAR)  , CAST(cd_nm AS NVARCHAR)
- , REPLICATE('0', 5 - LEN(sort_order)) + CAST(sort_order AS VARCHAR) -- 정렬 순서 5자리까지 지원+ , REPLICATE('0', 3 - LEN(sort_order)) + CAST(sort_order AS VARCHAR) -- 정렬 순서 3자리(999)까지 지원 
 + -- , REPLICATE('0', 4 - LEN(sort_order)) + CAST(sort_order AS VARCHAR) -- 정렬 순서 4자리(9999)까지 지원 
 + -- , REPLICATE('0', 5 - LEN(sort_order)) + CAST(sort_order AS VARCHAR) -- 정렬 순서 5자리(99999)까지 지원
  FROM  FROM
  ex_recursive  ex_recursive
줄 117: 줄 124:
  , b.cd_lvl + 1  , b.cd_lvl + 1
  , CAST((b.cd_nm_depth + ' > ' + a.cd_nm) AS NVARCHAR)  , CAST((b.cd_nm_depth + ' > ' + a.cd_nm) AS NVARCHAR)
- , b.seq + ':' + REPLICATE('0', 5 - LEN(a.sort_order)) + CAST(a.sort_order AS VARCHAR) -- 정렬 순서 5자리까지 지원+ , b.seq + ':' + REPLICATE('0', 3 - LEN(a.sort_order)) + CAST(a.sort_order AS VARCHAR) -- 정렬 순서 3자리(999)까지 지원 
 + -- , b.seq + ':' + REPLICATE('0', 4 - LEN(a.sort_order)) + CAST(a.sort_order AS VARCHAR) -- 정렬 순서 4자리(9999)까지 지원 
 + -- , b.seq + ':' + REPLICATE('0', 5 - LEN(a.sort_order)) + CAST(a.sort_order AS VARCHAR) -- 정렬 순서 5자리(99999)까지 지원
  FROM  FROM
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SELECT SELECT
줄 133: 줄 142:
  
 ===== Oracle/Tibero ===== ===== Oracle/Tibero =====
-<sxh sql; gutter: true; highlight: [84];> +<sxh sql; gutter: true; highlight: [16, 92];> 
--- Oracle 9i 이상 +/* 
--- Tibero 최소 지원 버전 미+ Oracle 9i 이상/Tibero 3 이 
 +*/
 SELECT SELECT
  cd_id  cd_id
줄 154: 줄 164:
 ; ;
  
--- Oracle 11g 이상 +/* 
--- Tibero 최소 지원 버전 미+ Oracle 11g 이상/Tibero 3 이 
 +*/
 WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS ( WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS (
  SELECT  SELECT
줄 164: 줄 175:
  , 1  , 1
  , '' || cd_nm  , '' || cd_nm
- , LPAD(sort_order, 5, '0') -- 정렬 순서 5자리까지 지원+ , LPAD(sort_order, 3, '0') -- 정렬 순서 3자리(999)까지 지원 
 + -- , LPAD(sort_order, 4, '0') -- 정렬 순서 4자리(9999)까지 지원 
 + -- , LPAD(sort_order, 5, '0') -- 정렬 순서 5자리(99999)까지 지원
  FROM  FROM
  ex_recursive  ex_recursive
줄 177: 줄 190:
  , b.cd_lvl + 1  , b.cd_lvl + 1
  , b.cd_nm_depth || ' > ' || a.cd_nm  , b.cd_nm_depth || ' > ' || a.cd_nm
- , b.seq || ':' || LPAD(a.sort_order, 5, '0') -- 정렬 순서 5자리까지 지원+ , b.seq || ':' || LPAD(a.sort_order, 3, '0') -- 정렬 순서 3자리(999)까지 지원 
 + -- , b.seq || ':' || LPAD(a.sort_order, 4, '0') -- 정렬 순서 4자리(9999)까지 지원 
 + -- , b.seq || ':' || LPAD(a.sort_order, 5, '0') -- 정렬 순서 5자리(99999)까지 지원
  FROM  FROM
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SELECT SELECT
줄 191: 줄 206:
 ; ;
  
--- Oracle 12c 이상+/* 
 + Oracle 12c 이상 
 +*/
 WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth) AS ( WITH tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth) AS (
  SELECT  SELECT
줄 215: 줄 232:
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SEARCH DEPTH FIRST BY sort_order SET seq SEARCH DEPTH FIRST BY sort_order SET seq
줄 228: 줄 245:
  
 ===== PostgreSQL ===== ===== PostgreSQL =====
-<sxh sql; gutter: true; highlight: [63];> +<sxh sql; gutter: true; highlight: [67];> 
--- PostgreSQL 8.4 이상+/* 
 + PostgreSQL 8.4 이상 
 +*/
 WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS ( WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth, seq) AS (
  SELECT  SELECT
줄 255: 줄 274:
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SELECT SELECT
줄 265: 줄 284:
 ; ;
  
--- PostgreSQL 14 이상+/* 
 + PostgreSQL 14 이상 
 +*/
 WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth) AS ( WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, sort_order, cd_lvl, cd_nm_depth) AS (
  SELECT  SELECT
줄 289: 줄 310:
  ex_recursive a  ex_recursive a
  INNER JOIN tree b  INNER JOIN tree b
- ON a.parent_cd_id = b.cd_id+ ON b.cd_id = a.parent_cd_id
 ) )
 SEARCH DEPTH FIRST BY sort_order SET seq SEARCH DEPTH FIRST BY sort_order SET seq
줄 300: 줄 321:
 ; ;
 </sxh> </sxh>
 +
 +{{tag>"쿼리" "Query" "응용"}}