row_number() OVER (partition .. 문 대체할 쿼리문 0 1 5,321

by papamama [Tibero] row_number [2020.10.07 05:05:06]


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 이런 식으로

 

by 마농 [2020.10.07 08:35:11]

DBLink 문제 맞나요?
MAX( ROW_NUMBER() ) 해서 에러 난게 아닌지?
집계함수 안에서 분석함수 사용.
혹시 인라인뷰 안에서 ROW_NUMBER() 하고 밖에서 MAX 했는데도 해당 오류가 발생한 거라면?
쿼리변환이 발생되지 않아야 할 상황인데도 불구하고
불필요한 쿼리변환(뷰머징)이 발생되어 에러가 난게 아닌가 하네요.(버그?)
하지만 쿼리를 잘 살펴보면 GROUP BY MAX(DECODE 가 불필요해 보이는 상황입니다.
단순하게 WHERE rn = 1 하면 해결될 상황으로 보입니다.

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