기술 정보
home
채널 소개
home

MSSQL 재귀 쿼리의 Tibero 전환 방법 (with 절)

문서 유형
기술 정보
분야
마이그레이션
키워드
MSSQL
재귀 쿼리
WITH절
1 more property

개요

SQL Server에서 Tibero로 이관 시, MSSQL의 재귀 쿼리 문법은 Tibero와 차이가 있어 변환이 필요합니다.
본 글은 재귀 쿼리의 기본 형태를 Tibero에서 사용할 수 있도록 변환하는 방법을 설명합니다.

방법

MSSQL 재귀 쿼리 예시

아래 쿼리에서 20라인 TMP_USER_GROUP10 부분은 첫 라인의 WITH 절 이름과 동일합니다.
MSSQL에서는 WITH 절 내부에서 자기 자신을 호출하여 재귀 쿼리를 구성할 수 있습니다.
WITH TMP_USER_GROUP10 AS ( SELECT groupCoCd ,groupIdnfr ,upperGroupIdnfr ,legacyPK ,upperLegacyPK ,name ,CONVERT(VARCHAR(1000), name) AS nameList FROM pms.mPMS_USER_GROUP10 WHERE regiStusDstcd IN ('10', '20') AND groupCoCd = @GROUPCOCD AND groupIdnfr = @GROUP_IDNFR UNION ALL SELECT B.groupCoCd ,B.groupIdnfr ,B.upperGroupIdnfr ,B.legacyPK ,B.upperLegacyPK ,B.name ,CONVERT(VARCHAR(1000), CONVERT(VARCHAR(1000), B.name) + '/' + A.nameList) AS nameList FROM TMP_USER_GROUP10 A INNER JOIN pms.mPMS_USER_GROUP10 B ON A.groupCoCd = B.groupCoCd AND A.upperGroupIdnfr = B.groupIdnfr ) SELECT @DEPTNAME = nameList FROM TMP_USER_GROUP10 WHERE upperGroupIdnfr = 0;
SQL
복사

Tibero 변환 예시

아래와 같이 START WITH ~ CONNECT BY 형식으로 변환할 수 있습니다. 다만 MSSQL 쿼리와 동일한 순서를 보장하려면 별도의 ORDER BY 절을 추가해야 합니다.
WITH TEMP AS ( SELECT ROWNUM AS rownu ,NAME FROM pms_LGDMOPDB.mPMS_USER_GROUP10 WHERE regiStusDstcd IN ('10', '20') AND groupCoCd = v_GROUPCOCD START WITH groupIdnfr = v_GROUP_IDNFR CONNECT BY PRIOR upperGroupIdnfr = groupIdnfr ORDER BY rownu DESC ) SELECT AGGR_CONCAT(NAME, '/') FROM TEMP;
SQL
복사

Tibero 쿼리 작성 시 참고사항

순서 이슈 없이 MSSQL 쿼리와 최대한 동일한 형태로 변경하는 방법은 아래와 같습니다.
아래 쿼리에서 붉은색 부분은 MSSQL 구문을 Tibero 문법에 맞추어 변환한 부분입니다. 또한 WITH 절 내부에 사용할 컬럼을 나열하면 MSSQL 쿼리와 유사한 구조로 작성할 수 있습니다.
WITH TMP_USER_GROUP10 ( groupCoCd, groupIdnfr, upperGroupIdnfr, legacyPK, upperLegacyPK, name, nameList) AS ( SELECT groupCoCd ,groupIdnfr ,upperGroupIdnfr ,legacyPK ,upperLegacyPK ,name ,CONVERT(VARCHAR(1000), name) AS nameList FROM pms.mPMS_USER_GROUP10 WHERE regiStusDstcd IN ('10', '20') AND groupCoCd = @GROUPCOCD AND groupIdnfr = @GROUP_IDNFR UNION ALL SELECT B.groupCoCd ,B.groupIdnfr ,B.upperGroupIdnfr ,B.legacyPK ,B.upperLegacyPK ,B.name ,CONVERT(VARCHAR(1000), CONVERT(VARCHAR(1000), B.name) + '/' + A.nameList) AS nameList FROM TMP_USER_GROUP10 A INNER JOIN pms.mPMS_USER_GROUP10 B ON A.groupCoCd = B.groupCoCd AND A.upperGroupIdnfr = B.groupIdnfr ) SELECT @DEPTNAME = nameList FROM TMP_USER_GROUP10 WHERE upperGroupIdnfr = 0;
SQL
복사