개요
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
복사