source

Oracle SQL: IN 절 내에서 1000개 이상의 항목을 사용하는 방법

manysource 2023. 9. 12. 20:05

Oracle SQL: IN 절 내에서 1000개 이상의 항목을 사용하는 방법

1200의 데이터를 받고 싶은 SQL 문의가 있습니다.ep_codes을 이용하여IN1000개 이상 포함 시ep_codesIN 조항 안에서 오라클은 내가 그렇게 할 수 없다고 말합니다.이를 극복하기 위해 SQL 코드를 다음과 같이 변경해 보았습니다.

SELECT period, ...
FROM   my_view
WHERE  period = '200912'
       ...
       AND ep_codes IN (...1000 ep_codes...)
       OR  ep_codes IN (...200 ep_codes...)

코드가 성공적으로 실행되었지만 결과가 이상합니다(계산 결과는 200912년에만 해당하는 것이 아니라 모든 기간에 대해 가져오기 때문에 제가 원하는 것이 아닙니다).사용하는 것이 적절한가요?OR사이에IN아니면 두 개의 개별 코드를 1000 코드와 200 ep_code로 실행해야 합니까?


파스칼 마틴의 솔루션은 완벽하게 작동했습니다.소중한 제안을 해주신 모든 분들께 감사드립니다.

Oracle에서 이 문제를 처리하는 방법은 Temporary Table을 생성하고 값을 여기에 기록한 다음 여기에 가입하는 것이 좋습니다.동적으로 생성된 사용INclaus는 쿼리 최적화자가 모든 쿼리에 대해 '하드 구문 분석'을 수행한다는 것을 의미합니다.

create global temporary table LOOKUP
(
    ID NUMBER
) on commit delete rows;

-- Do a batch insert from your application to populate this table
insert into lookup(id) values (?)

-- join to it
select foo from bar where code in (select id from lookup)

A에서 이렇게 많은 값을 사용하는지 확실하지 않습니다.IN()좋은 일인가요? 특히 공연을 위해서요.

"결과가 이상하다"고 말할 때, 괄호에 문제가 있어서 그런 것은 아닐까요?당신이 제안한 것 대신에 이것을 시도해 보면 어떨까요.

SELECT ...
FROM ...
WHERE ...
      AND (
          ep_codes IN (...1000 ep_codes...)
          OR  ep_codes IN (...200 ep_codes...)
      )

이것이 결과를 덜 이상하게 만듭니까?

실제로 여기서 컬렉션/멀티셋을 사용할 수 있습니다.그것들을 보관하려면 번호표 종류가 필요합니다.

CREATE TYPE NUMBER_TABLE AS TABLE OF NUMBER;
...
SELECT *
FROM my_view
WHERE period MEMBER OF NUMBER_TABLE(1,2,3...10000)

멀티셋에 대한 자세한 내용은 여기에서 확인하십시오.

성능과 유지보수성을 위해서는 코드를 별도의 테이블에 넣는 것이 더 좋을 것 같습니다.

SELECT ...
FROM ...
WHERE ...
   AND ep_code in (select code from ep_code_table)

1200을 삽입해주시겠습니까?ep_code임시 테이블에 값을 입력한 다음INNER JOIN행을 걸러내기 위해 그 테이블에?

SELECT a.*
FROM mytable a
INNER JOIN tmp ON (tmp.ep_code = a.ep_code)
WHERE ...

언급URL : https://stackoverflow.com/questions/2401066/oracle-sql-how-to-use-more-than-1000-items-inside-an-in-clause