ORA-01795 : 목록에 지정 가능한 식의 최대수는 1000 입니다. 해결방법
오라클 Docs에 따르면 ORA-01795의 원인과 해결방법을 아래와 같이 제시하고 있다.
ORA-01795: maximum number of expressions in a list is 1000
Cause: Number of expressions in the query exceeded than 1000. Note that unused column/expressions are also counted Maximum number of expressions that are allowed are 1000.
Action: Reduce the number of expressions in the list and resubmit.
발생 원인
Oracle Docs의 내용을 직역하자면 아래와 같다.
원인: 쿼리의 식 수가 1000을 초과했습니다. 사용되지 않은 열 / 식도 계산됩니다. 허용되는 최대 식 수는 1000입니다.
조치: 목록에서 표현식 수를 줄이고 다시 제출하십시오.
필자는 IN() 절 안의 값의 개수가 1000개를 초과하여 발생하였다.
테스트 케이스
-- IN() 내부에 1000개가 넘는 데이터가 있다고 가정
SELECT *
FROM TEMP
WHERE NEW_USER IN ('상후', '후상', '무수히 많은 데이터');
해결 방법
IN절 내부에 서브쿼리를 사용하여 해결이 가능합니다.
SELECT *
FROM NEW_USER
WHERE NAME IN (SELECT NAME FROM OLD_USER);
추가 해결방법 정리
SELECT *
FROM NEW_USER
WHERE NAME IN ('A', 'B')
OR NAME IN ('C', 'D')
OR NAME IN ('E', 'F');
이런식으로 OR을 활용하여 회피도 가능하다.
혹시나 Mybatis를 쓰고있다면 아래와 같이 작성하면 된다.
출처 : https://stackoverflow.com/questions/36366300/mybatis-foreach-hitting-limit-of-1000
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<trim suffixOverrides=" OR ID IN ()">
<foreach item="item" index="index" collection="list" open="(" close=")">
<if test="index != 0">
<choose>
<when test="index % 1000 == 999">) OR ID IN (</when>
<otherwise>,</otherwise>
</choose>
</if>
#{item}
</foreach>
</trim>
</select>
999번째에서 괄호를 닫고 OR를 이어붙이면서 쿼리를 동적으로 생성하는 방법이다.
<trim suffixOverrides> = <trim> 문 안에 쿼리 가장 뒤에 해당하는 문자들이 있으면 자동으로 지워준다.
출처 : https://www.oraexcel.com/database-oracle-11gR2-ORA-01795/lang-ko
관련 stackOverflow : https://stackoverflow.com/questions/17842453/is-there-a-workaround-for-ora-01795-maximum-number-of-expressions-in-a-list-is
'Oracle' 카테고리의 다른 글
[프로그래머스/ORACLE] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (2) | 2023.11.18 |
---|---|
[프로그래머스/ORACLE] 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2023.11.17 |
[Oracle] NVARCHAR2에서 VARCHAR2로 형 변환 하기 (0) | 2023.10.04 |
[Oracle] LISTAGG 사용 시 적용 안 되는 케이스(NVARCHAR2) (0) | 2023.10.04 |
[Oracle] ORA-01839 : "지정된 월에 대한 날짜가 부적합합니다" 해결 feat. ChatGPT (0) | 2023.04.04 |
댓글