2009-03-10 2 views
0

코드 및 부서를 기반으로 직원을 검색하려고합니다.쿼리 실행 중 "IN"문제

1200 명의 직원 코드가있는 IN 연산자를 사용하여 쿼리를 트리거했습니다. 쿼리를 실행할 때 예외가 발생했습니다 ("IN에서 최대 1000 개의 레코드 허용").

누구든지 나를 도와 줄 수 있습니까?

+0

SQL 코드를 게시하십시오. –

+0

1200 개의 항목이있는 IN 문을 정말로보고 싶습니까? – kdgregory

+0

D' oh 당신의 코멘트는 내가 틀린 것을 묻고 있다는 것을 깨닫게했다 ;-) 고마워. – RuudKok

답변

1

이 많은 DBMS 더와

SELECT * FROM table WHERE col IN (...) 

같은 쿼리를 허용하지 않습니다를 목록에있는 1,000 개 이상의 값 어쩌면 미만 1,000 값의 덩어리를 사용하여 분할 할 수 있습니다 :

SELECT * FROM table WHERE col IN (...) OR col IN (...) 

또는

SELECT * FROM table WHERE col IN (...) 
UNION 
SELECT * FROM table WHERE col IN (...) 

(그것은 이해하고 일을 할 가능성이없는 것이지만).

그렇지 않으면 임시 테이블에 값을 저장하고 대신 JOIN을 사용해야합니다. 1,200 개의 코드를 어디에서 가져 옵니까? 동일한 데이터베이스에 있지 않습니다. :)

+0

많은 IN 쿼리를 사용하는 것이 좋습니다. 성능에 영향을 미치지 않습니까? –

+0

DBMS의 성능에 따라 다릅니다. 인덱싱 된 열과 함께 임시 테이블을 사용하는 것이 더 빠를 것입니다. 솔직히 말해서 테이블을 리펙토링하는 것이 좋습니다! –

5

이러한 레코드를 임시 테이블에 업로드하고 조인을 사용하는 것이 거의 확실하게 빠를 것입니다. 그대로, 파서는 IN을위한 거대한 조건 트리를 만들어야합니다.

참고 : MYSQL이 Oracle 또는 SQLServer의 트랜잭션 수준 임시 테이블을 지원하는지는 모르겠지만 "실제"테이블조차도 특히 한 번 생성되어 다시 사용되는 경우 더욱 빨라야합니다. 물론 테이블에 일괄 삽입 기능, 트랜잭션 로그 작성 비용, & c와 같은 많은 변수가 있습니다.

질문을 다시 읽기 : 직원 코드는 어디서 구합니까? 테이블에서 그들을 잡거나 가입 할 수 있습니까?

+0

그것을 얻는 절차 호출 저장된 다른 데이터베이스 (테이블)의 직원 코드 –

0

, 당신의 직원 코드를 포함하여 작성하고 다음과 같이 쿼리 것 (임시) 테이블 만들기 :

SELECT * 
FROM mytable 
WHERE empcode IN (SELECT mycode FROM temptable) 
+0

이됩니다 faster.Coz 이미 다른 테이블에서 직원 코드를 얻으려면 절차를 저장 –

0

메모리 임시 테이블 (작은 테이블 만)을 만들고 저장 프로 시저 결과로 채 웁니다. 임시 테이블에서 조인을 사용하여 select를 수행하십시오. 임시 테이블을 삭제하십시오.

CREATE TEMPORARY TABLE ENGINE=MEMORY tmp AS 
    SELECT code FROM employee; // in-memory temporary table (small tables) 

SELECT col1, col2 FROM table 
    INNER JOIN tmp ON table.code = tmp.code; // join faster than subquery 

DROP TEMPORARY TABLE tmp; // cleanup temporary table