데이터베이스 개발자 질문과 답변 게시판
여러분께 도움을 요청드립니다.
오라클 쿼리를 MS-SQL로 바꾼건데 결과가 다르게 나오네요
MS-SQL로 바꾼 쿼리에 뭐가 잘못된건지 아시는 분 좀 도움을 부탁드립니다.
MS-SQL Server
2008기준이니까 상위버전의 기능을 사용한 해결책은 알려주셔도 사용을 못합니다.
l 원본 Oracle 쿼리
SELECT GrpCd,
DeptCd, SectCd, RespCd, TeamCd, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD
FROM XDeptInfo
WHERE TeamCd =
'00'
AND RespCd = '00'
AND SectCd = '00'
AND NSosogCd <> 'ROOT'
START WITH NSosogCd = 'CIA0' // 입력 파라미터 값
CONNECT BY PRIOR ParentNSosogCd = NSosogCd
l MS-SQL로 변환한 쿼리
WITH
CTE(GRPCD, DEPTCD, SECTCD, RESPCD, TEAMCD, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD)
AS
(
SELECT GrpCd, DeptCd, SectCd, RespCd, TeamCd, NSOSOGCD, DPSOSOGCD,
PARENTNSOSOGCD
FROM MDS_Common.dbo.XDEPTINFO
WHERE TEAMCD = '00'
AND RESPCD ='00'
AND SECTCD = '00'
AND NSOSOGCD <> 'ROOT'
AND NSOSOGCD = 'CIA0' // 입력 파라미터 값
UNION ALL
SELECT A.GrpCd, A.DeptCd, A.SectCd, A.RespCd, A.TeamCd,
A.NSOSOGCD, A.DPSOSOGCD, A.PARENTNSOSOGCD
FROM MDS_Common.dbo.XDEPTINFO A
inner join CTE B
on A.NSOSOGCD = B.PARENTNSOSOGCD
WHERE A.TEAMCD = '00'
AND A.RESPCD ='00'
AND A.SECTCD = '00'
AND A.NSOSOGCD <> 'ROOT'
)
SELECT * from
CTE
미리 고맙습니다.
Comment 11
-
건우아빠
2013.01.28 17:27
-
딸기귀신
2013.01.28 17:52
건우아빠님...
도움주셨는데 뭐가 잘못된건지 역시나 결과는 안나옵니다. ㅜ.ㅜ -
건우아빠
2013.01.28 17:58
샘플 데이터하고 원하시는 형태가 어덯게 나와야 하는지를 같이 말씀해주세여...
재귀쿼리인데... 크게 잘못된것은 없는듯 해서요...
자료의 값이 어떻게 되어 있는지에 따라...
-
딸기귀신
2013.01.28 18:18
데이터 첨부합니다. 엑셀파일인데 가능하실지...
그리고 오라클 결과값입니다.
GRPCD DEPTCD SECTCD RESPCD TEAMCD NSOSOGCD DPSOSOGCD PARENTNSOSOGCD C0 I0 00 00 00 CI00 5670 C000 C0 00 00 00 00 C000 5600 ROOT -
건우아빠
2013.01.28 18:41
일단 'CIA0' 값이 있는 레코는 하나구요.
이때 SECTCD = '00' 은 없구 'A0' 이기때문에 아예 안나오는겁니다... 일단 여기까지 확인중
확인해보시 쿼리 값을 부모들을 나오게 하는 내용 같습니다.
쿼리에서 내용은 크게 바뀌는게 없는데 최초
with CTE(GRPCD, DEPTCD, SECTCD, RESPCD, TEAMCD, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD)
AS
(
SELECT GrpCd, DeptCd, SectCd, RespCd, TeamCd, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD
FROM XDEPTINFO
WHERE NSOSOGCD <> 'ROOT'
AND NSOSOGCD = 'CIA0'
UNION ALL
SELECT A.GrpCd, A.DeptCd, A.SectCd, A.RespCd, A.TeamCd, A.NSOSOGCD, A.DPSOSOGCD, A.PARENTNSOSOGCD
FROM XDEPTINFO A
inner join CTE B
on A.NSOSOGCD = B.PARENTNSOSOGCD
WHERE A.TEAMCD = '00'
AND A.RESPCD ='00'
AND A.SECTCD = '00'
AND A.NSOSOGCD <> 'ROOT'
)
SELECT *
from CTE
where NSOSOGCD <> 'CIA0' -
딸기귀신
2013.01.28 18:47
그런데 이상한게 오라클에서도
SELECT GrpCd, DeptCd, SectCd, RespCd, TeamCd, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD
FROM XDeptInfo
WHERE TeamCd = '00'
AND RespCd = '00'
AND SectCd = '00'
AND NSosogCd <> 'ROOT'
AND NSosogCd = 'CIA0'
만 돌리면 결과는 안나옵니다.
그런데 저 재귀 쿼리를 돌리면 결과가 나옵니다.
-
건우아빠
2013.01.28 18:58
ㅎㅎ
START WITH NSosogCd = 'CIA0' --> 이 부분이 오라클과 mssql이 다른점입니다. 이걸 where절로 넣어 버렸기 때문에 이런 문제가 발생 하는듯 합니다. 시작을 'CIA0' 부터 시작해서 순환해서 자료를 가져올때 위 where절 조건을 가져오라는 의미입니다. mssql에서 cte로 할때는 위쪽 쿼리를 이 부분이 나오게 쿼리가 작성 되어야 다음 단계로 반복해서 찾아 갈수 있습니다.
CONNECT BY PRIOR ParentNSosogCd = NSosogCd
-
딸기귀신
2013.01.28 19:41
그렇군요 START WITH 와 where 의 처리 우선 순위에 따라 결과가 달라지네요
신경써 주셔서 정말 고맙습니다.
-
쓸만한게없네(윤선식)
2013.01.29 10:19
이제... 오라클은 건우아빠님께. ^^.
-
건우아빠
2013.01.29 12:28
ㅋㅋ 쿼리는 mssql이나 오라클이나 똑같죠...
각 디비에서 쓰는 명령 기술 방법이 조금 다를뿐이구요..
저도 naver형에게 물어보고 그냥 아는체 했을뿐입니다. 형이 모를때는 구글 누나나 야후 삼촌에게 물어보면 잘 가르쳐 주더라구요...
대신 물어 볼때는 mssql에서의 기능은 오라클에서 어떻게 해요하면 빨리 가르쳐 주지만, 형,누나, 삼촌이 모르는 말로 이거 어떻게 해요하면 잘 안가르쳐줍니다. ㅋㅋㅋㅋ
전오라클 2001년까지 써보고 안써봐서 성대개발 나갔을때가 마지막이어서 잘 모릅니다...
-
쓸만한게없네(윤선식)
2013.01.29 14:43
검색도 기술이죠. ^^.
그리고 워낙 답변을 잘 다시니 부러울 따름입니다. ^^.
SELECT GrpCd, DeptCd, SectCd, RespCd, TeamCd, NSOSOGCD, DPSOSOGCD, PARENTNSOSOGCD
FROM MDS_Common.dbo.XDEPTINFO
WHERE TEAMCD = '00'
AND RESPCD ='00'
AND SECTCD = '00'
AND NSOSOGCD <> 'ROOT'
AND NSOSOGCD = 'CIA0' // 입력 파라미터 값
UNION ALL
SELECT A.GrpCd, A.DeptCd, A.SectCd, A.RespCd, A.TeamCd, A.NSOSOGCD, A.DPSOSOGCD, A.PARENTNSOSOGCD
FROM MDS_Common.dbo.XDEPTINFO A
inner join CTE B
on A.NSOSOGCD = B.PARENTNSOSOGCD