일자와 차수 컬럼에 조건을걸때. 0 2 996

by 스파르타 [Oracle 기초] [2019.07.09 10:26:26]


mDt          ||       mSeq 

===================

20190708          10

20190708           10

20190709            1

20190709            2

 

이렇게 데이터가있으면. 일자 바차타입  차수 넘버타입

where mDt||mSeq  <=  '20190709'||1

and rownum  < 11

 

10건을 가져오되  일자에 차수 가 조건으로 걸리는데.

좌변을 저렇게 붙여서 크기로 비교하는방법밖에는 없나요? 좀 더 좋은 방법이 없나해서여...

by jkson [2019.07.09 11:52:41]

mDt||mSeq  <=  '20190709'||1 --> 잘못된 조회 조건입니다.

'20190708'||2 --> 이렇게 조회하면 2차 이전 값이 나와야 하는데 20190708 10차가 나오게 됩니다.
최대차수를 5자리라 보고..
mdt||lpad(mseq,5,'0') <'20190708'||lpad(to_char(2),5,'0') 이게 맞겠고요.

하지만 이렇게 사용하게 되면 mdt나 mseq에 인덱스를 활용 못 하게 됩니다.(컬럼을 가공했으므로..)

mdt에 인덱스가 있고 전체 데이터 중 한정적인 데이터만 조회하는 경우라면(위에 처럼 rownum < 11 조건이 있다든지..)

mdt <= '20190708'
and ((mdt = '20190708' and mseq < 2) or mdt != '20190708')

이게 나을 거 같고요.

조회하는 량이 데이터 전체량의 대부분을 차지한다면

위의 concat.. full scan 방법도 나쁘지 않습니다.


by 스파르타 [2019.07.10 09:14:52]

아 맞네요...  데이터가없어서 그부분 테스트를 못했습니다. 정말감사합니다^^

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