tibero DB를 마이그레이션 하면서
로컬 DB에서 이용하던 쿼리문을 db*link를 통하여 데이터를 조회하게 되었습니다.
그런데 DB*link 이용시에는 ROW_NUMBER() OVER (PARTITION...) 분석 함수를 이용할 수 없다고 에러가 올라옵니다.
MAX(CASE WHEN (ROW_NUMBER() OVER (PARTITION BY QB_012."
^; nested exception is java.sql.SQLException: JDBC-12126:Database link client API error - Analytic function cannot be used in this clause
쿼리문 요약
--
SELECT DATA.KEY_ID, MAX(DECODE(DATA.RN, 1, DATA.컬럼명, NULL)) AS <alias명>, .....
FROM (
b.key_id, ....,
ROW_NUMBER() OVER (PARTITION BY F.FLIGHT_PK ORDER BY F.FLIGHT_PK, G.VIA_NUM) RN
FROM <table a>, <table b>
WHERE clause
) DATA
GROUP BY DATA.key_id
최종목적은 ROW_NUMBER() 이용하듯이 서브그룹별 순번값을 구하고자 함입니다.
a 1
a 2
a 3
b 1
c 1
d 1 이런 식으로
DBLink 문제 맞나요?
MAX( ROW_NUMBER() ) 해서 에러 난게 아닌지?
집계함수 안에서 분석함수 사용.
혹시 인라인뷰 안에서 ROW_NUMBER() 하고 밖에서 MAX 했는데도 해당 오류가 발생한 거라면?
쿼리변환이 발생되지 않아야 할 상황인데도 불구하고
불필요한 쿼리변환(뷰머징)이 발생되어 에러가 난게 아닌가 하네요.(버그?)
하지만 쿼리를 잘 살펴보면 GROUP BY MAX(DECODE 가 불필요해 보이는 상황입니다.
단순하게 WHERE rn = 1 하면 해결될 상황으로 보입니다.