mssql쿼리를 오라클 쿼리로 변경할려는데 오류가 납니다. 0 6 1,710

by 피터슨 [SQL Query] 오라클 mssql 쿼리 [2016.04.07 09:07:13]


 select * from  ( 
        select row_number() over( order by REGI_DD desc ) as rNum, NO, REGI_DD,  
        (select FILE_NAME from EN_COM_BOARD where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID ) as LOGO_FILE,  
        (select COMP_NM_KOR from EN_COM_BOOTH where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID ) as COMP_NM,  
        (select APP_DEPT from EN_COM_BOOTH where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID ) as APP_DEPT  
        from EN_COM_DR where REAL_YN = 'Y' and BRAND = '2'  
) A where mod (rNum,2) = 0 

 

위에 mssql 쿼리를 오라클 쿼리로 변경할려는데 ORA-01427 :라는 오류가 납니다. 인터넷에 찾아보니 IN을 써주라는데

자꾸 오류가 나네요 어디를 수정해야 할까요..? 알려주시면 감사하겠습니다.

 

by 백면서생 [2016.04.07 09:15:05]
-- ORA-01427 :single-row subquery returns more than one row.
-- 다시말해 스칼라서브쿼리는 하나의 행만 리턴되어야 합니다.
-- aggregate function을 사용하시던지 rownum을 사용하시던지 로직에 맞게
-- 하나의 열이 되도록 해보세요.

 


by 창조의날개 [2016.04.07 09:19:28]

select * from  ( 
        select row_number() over( order by REGI_DD desc ) as rNum, NO, REGI_DD,  
               (select FILE_NAME from EN_COM_BOARD where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID 
                    AND ROWNUM = 1) as LOGO_FILE,  
               (select COMP_NM_KOR from EN_COM_BOOTH where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID  
                    AND ROWNUM = 1) as COMP_NM,  
               (select APP_DEPT from EN_COM_BOOTH where REAL_YN = 'Y' and 
                    CO_IDNUM = EN_COM_DR.CO_IDNUM and YEAR = EN_COM_DR.YEAR and REG_ID = EN_COM_DR.REG_ID  
                    AND ROWNUM = 1) as APP_DEPT  
        from EN_COM_DR 
        where REAL_YN = 'Y' and BRAND = '2'  
) A 
where mod (rNum,2) = 0 
;

SELECT 절에서 사용하는 스칼라서브쿼리에서 반환되는 값이 1개의 로우이어야 하는데 여러개의 로우가 발생하는 경우가 있기 때문입니다.

 

위와 같이 하면 에러는 나지 않겠지만 WHERE 조건에 로우를 1개만 가져오도록 하였기 때문에 원하는 값이 오지 않고 잘못된 값이 올수 있으며..

 

만약 여러개의 값이 SELECT 된다해도 모두 같은 값이라면 SELECT 문을 다른 방법으로 만들어야 합니다.

 

또한 현재 서브쿼리에서 UNIQUE INDEX를 사용 할 수 없는 스칼라서브쿼리보다는 JOIN으로 쿼리를 바꾸는게 더 좋아보입니다..

 


by 창조의날개 [2016.04.07 10:34:47]

rownum = 1 했을 경우 원하는 결과를 못가져 온다면...

쿼리의 where을 잘못 넣었다고 봐야 합니다.

 

또는 월래 1개의 로우를 절대로 가져 올 수 없는 경우일 수도 있겠죠..

그럼 join 으로 n:m 관계가 만들어 져서 로우수가 처음에 EN_COM_DR 테이블을 조회 했던 것보다 많이 나오게 될 것입니다.

 

어느 것이 옳은지는 업무나 데이터 내용을 모르니.. 알수가 없군요..

 


by 피터슨 [2016.04.07 11:05:08]

감사합니다. 해결했습니다. and rownum = 1 하면 되더군요

아까는 제가 다른 조건을 잘못줘서 값이 이상하게 나왔던거였습니다..ㅜ

 


by 피터슨 [2016.04.07 09:26:19]

아 그렇군요.. 실제로 and rownum = 1 하니 제가 원하는 값을 가져오지는 못하네요

그럼 join으로 해서 쿼리를 새로 짜라는 말씀이시죠?


by 마농 [2016.04.07 10:14:56]

원하는 결과를 모르니 답변이 불가하네요.

그냥 원본 MSSQL 쿼리를 올려주세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입