문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
기술문서:레퍼런스:쿼리:응용:recursive_query [2025/04/14 17:47] carlito76 |
기술문서:레퍼런스:쿼리:응용:recursive_query [2025/11/27 12:05] (현재) carlito76 |
||
|---|---|---|---|
| 줄 6: | 줄 6: | ||
| ====== Recursive Query ====== | ====== Recursive Query ====== | ||
| - | ^ 물리명 | + | <note tip> |
| - | | 코드ID | cd_id | 문자 | PK | | + | 최소 지원 버전은 약간의 차이가 있을 수 있습니다. |
| - | | 코드명 | cd_nm | 문자 | | | + | </ |
| - | | 부모 코드ID | parent_cd_id | 문자 | | | + | |
| - | | 정렬 순서 | sort_order | 숫자 | | | + | |
| + | ===== 테이블 명세 ===== | ||
| + | ^ 물리명 | ||
| + | | 코드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/ | ||
| - | 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/ | ||
| 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 | + | sort_order |
| ); | ); | ||
| </ | </ | ||
| 줄 56: | 줄 53: | ||
| ===== MySQL/ | ===== MySQL/ | ||
| <sxh sql; gutter: true;> | <sxh sql; gutter: true;> | ||
| - | -- MySQL 8.0 이상/ | + | /* |
| + | MySQL 8.0.1 이상/ | ||
| + | */ | ||
| WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, | WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, | ||
| SELECT | SELECT | ||
| 줄 65: | 줄 64: | ||
| , 1 | , 1 | ||
| , cd_nm | , cd_nm | ||
| - | , CAST(LPAD(CAST(sort_order AS CHAR), 5, ' | + | , CAST(LPAD(CAST(sort_order AS CHAR), 3, ' |
| + | -- , CAST(LPAD(CAST(sort_order AS CHAR), 4, ' | ||
| + | -- , CAST(LPAD(CAST(sort_order AS CHAR), 5, ' | ||
| FROM | FROM | ||
| ex_recursive | ex_recursive | ||
| 줄 78: | 줄 79: | ||
| , b.cd_lvl + 1 | , b.cd_lvl + 1 | ||
| , CONCAT(b.cd_nm_depth, | , CONCAT(b.cd_nm_depth, | ||
| - | , CAST(CONCAT(b.seq, | + | , CAST(CONCAT(b.seq, |
| + | -- , CAST(CONCAT(b.seq, | ||
| + | -- , CAST(CONCAT(b.seq, | ||
| 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 |
| ) | ) | ||
| 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, | WITH tree (cd_id, cd_nm, parent_cd_id, | ||
| SELECT | SELECT | ||
| 줄 104: | 줄 109: | ||
| , 1 | , 1 | ||
| , CAST(cd_nm AS NVARCHAR) | , CAST(cd_nm AS NVARCHAR) | ||
| - | , REPLICATE(' | + | , REPLICATE(' |
| + | -- , REPLICATE(' | ||
| + | -- , REPLICATE(' | ||
| 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 + ':' | + | , b.seq + ':' |
| + | -- , b.seq + ':' | ||
| + | -- , b.seq + ':' | ||
| 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 |
| ) | ) | ||
| SELECT | SELECT | ||
| 줄 133: | 줄 142: | ||
| ===== Oracle/ | ===== Oracle/ | ||
| - | <sxh sql; gutter: true; highlight: [84];> | + | <sxh sql; gutter: true; highlight: [16, 92];> |
| - | -- Oracle 9i 이상 | + | /* |
| - | -- Tibero | + | Oracle 9i 이상/Tibero |
| + | */ | ||
| SELECT | SELECT | ||
| cd_id | cd_id | ||
| 줄 154: | 줄 164: | ||
| ; | ; | ||
| - | -- Oracle 11g 이상 | + | /* |
| - | -- Tibero | + | Oracle 11g 이상/Tibero |
| + | */ | ||
| WITH tree (cd_id, cd_nm, parent_cd_id, | WITH tree (cd_id, cd_nm, parent_cd_id, | ||
| SELECT | SELECT | ||
| 줄 164: | 줄 175: | ||
| , 1 | , 1 | ||
| , '' | , '' | ||
| - | , LPAD(sort_order, | + | , LPAD(sort_order, |
| + | -- , LPAD(sort_order, | ||
| + | -- , LPAD(sort_order, | ||
| 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 || ':' | + | , b.seq || ':' |
| + | -- , b.seq || ':' | ||
| + | -- , b.seq || ':' | ||
| 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 |
| ) | ) | ||
| SELECT | SELECT | ||
| 줄 191: | 줄 206: | ||
| ; | ; | ||
| - | -- Oracle 12c 이상 | + | /* |
| + | Oracle 12c 이상 | ||
| + | */ | ||
| WITH tree (cd_id, cd_nm, parent_cd_id, | WITH tree (cd_id, cd_nm, parent_cd_id, | ||
| 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 |
| ) | ) | ||
| 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, | WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, | ||
| 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 |
| ) | ) | ||
| SELECT | SELECT | ||
| 줄 265: | 줄 284: | ||
| ; | ; | ||
| - | -- PostgreSQL 14 이상 | + | /* |
| + | PostgreSQL 14 이상 | ||
| + | */ | ||
| WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, | WITH RECURSIVE tree (cd_id, cd_nm, parent_cd_id, | ||
| 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 |
| ) | ) | ||
| SEARCH DEPTH FIRST BY sort_order SET seq | SEARCH DEPTH FIRST BY sort_order SET seq | ||
| 줄 300: | 줄 321: | ||
| ; | ; | ||
| </ | </ | ||
| + | |||
| + | {{tag>" | ||