ORDER BY DECODE 또는 CASE 사용 시 ORA-01791: SELECT 식이 부적합합니다. 0 4 151

by 기린기린 [SQL Query] [2020.05.22 11:46:18]



WITH TEMP_CODE AS
 (SELECT 'G1' CDTP, '6' CD, '코드6' CDNM
    FROM DUAL
  UNION ALL
  SELECT 'G1' CDTP, '1' CD, '코드1' CDNM
    FROM DUAL
  UNION ALL
  SELECT 'G1' CDTP, '2' CD, '코드2' CDNM
    FROM DUAL
  UNION ALL
  SELECT 'G1' CDTP, '3' CD, '코드3' CDNM
    FROM DUAL
  UNION ALL
  SELECT 'G1' CDTP, '4' CD, '코드4' CDNM
    FROM DUAL
  UNION ALL
  SELECT 'G1' CDTP, '5' CD, '코드5' CDNM
    FROM DUAL)
SELECT DISTINCT CD, CDNM
  FROM TEMP_CODE A
 WHERE A.CDTP = 'G1'
 ORDER BY DECODE(A.CDTP, 'G1', CD, NULL) DESC, CD


안녕하세요.

ORDER BY에 조건절을 두고 싶어 시도해보다가
개발서버(10g)에서는 잘되는 쿼리가 실서버(11g)에서는
ORA-01791에러가 나옵니다.
최종 조회되는 DISTINCT 컬럼 리스트에 없어서 에러가 나온다는 건 알겠는데
에러나는 CDTP 컬럼이 정렬되는 컬럼이 아닌 조건의 기준컬럼이라서 될 거라고 생각하고 시도했었습니다.

위 DUAL구문과 동일한 양식의 원쿼리(실테이블)가 
10g에서 작동하고 11g에서 작동안하길래 버전차이인가 했더니
위 DUAL 구문으로 시도하면 두 버전 다 안됩니다. 
또한 10g에서 작동하는 실쿼리에 DUAL구문에 해당하는 WHERE A.CDTP = 'G1' 절을 빼버리면 똑같이 동일에러 발생합니다. 

어떻게 하면 작동하게 만들 수 있을까요?

by 마농 [2020.05.22 14:16:12]

1. 원래는 오류입니다.
2. 다만, Where 조건이 있음으로 인해 논리적으로 보면 허용이 될 수 도 있다는 생각은 드네요.
3. 오류 해결은 Select 절에 case 문 똑같이 주면 됩니다.


by 기린기린 [2020.05.22 14:35:51]

감사합니다.
신기하게 작동안하고 하고 해서 원인만 초점을 맞추고 생각하다가
결과의 컬럼 개수가 CDTP가 빠진 2개만 나와야해서
해결에 너무 어렵게 생각했네요.
CDTP넣고 인라인뷰로 감싸서 해결했습니다.
정말 감사합니다~

 


by 마농 [2020.05.22 14:49:49]

그런데 Distinct 가 필요한가요?


by 기린기린 [2020.05.22 14:57:25]

PK가 CDTP, CD 로 된 테이블이어서
명시된 CDTP WHERE 조건절만 있으면 중복이 발생될 일이 없으니
필요없어보이고 의미도 없어보이는데 제가 작성한 코드는 아니어서요.
순차적으로 작성할 때 DISTINCT를 버릇처럼 쓴 게 아닐까 추측됩니다.
감사합니다~
 

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