복붙노트

[SQL] WHERE COL IN (...) 조건에 대한 제한

SQL

WHERE COL IN (...) 조건에 대한 제한

나는 다음과 같은 코드를 사용하고 있습니다 :

SELECT * FROM table
WHERE Col IN (123,123,222,....)

내가 IN 절에서 ~보다 더 많은 3000 개 번호를 넣어 경우, SQL 오류가 발생합니다.

크기가 있다면 누구나 알고 있나요 제한 또는 유사한 무엇?!

해결법

  1. ==============================

    1.사용중인 데이터베이스 엔진에 따라, 명령의 길이에 제한이있을 수 있습니다.

    사용중인 데이터베이스 엔진에 따라, 명령의 길이에 제한이있을 수 있습니다.

    SQL Server는 매우 큰 한계가있다 :

    http://msdn.microsoft.com/en-us/library/ms143432.aspx

    오라클은 다른 측면에서 한계에 도달하는 아주 쉬운 있습니다.

    그래서, 큰 IN 절을 위해, 그것은 값 삽입, 임시 테이블을 생성하고이 가입 할 것이 좋습니다. 그것은 빠르게도 작동합니다.

  2. ==============================

    2.()가 한계입니다,하지만 당신은에서의 별도의 블록으로 당신의 가치를 나눌 수 있습니다

    ()가 한계입니다,하지만 당신은에서의 별도의 블록으로 당신의 가치를 나눌 수 있습니다

    Select * 
    From table 
    Where Col IN (123,123,222,....)
    or Col IN (456,878,888,....)
    
  3. ==============================

    3.쿼리를 매개 변수화하고 매개 변수 값을 갖는 테이블을 사용하여 ID를 전달합니다.

    쿼리를 매개 변수화하고 매개 변수 값을 갖는 테이블을 사용하여 ID를 전달합니다.

    예를 들어, 다음과 같은 유형을 정의합니다 :

    CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY)
    

    다음 저장 프로 시저와 함께 :

    CREATE PROCEDURE sp__Procedure_Name
        @OrderIDs IdTable READONLY,
    AS
    
        SELECT *
        FROM table
        WHERE Col IN (SELECT Id FROM @OrderIDs)
    
  4. ==============================

    4.IN이 하위 선택 곳에 왜하지 ...

    IN이 하위 선택 곳에 왜하지 ...

    임시 테이블이나 뭔가에 사전 질의 ...

    CREATE TABLE SomeTempTable AS
        SELECT YourColumn
        FROM SomeTable
        WHERE UserPickedMultipleRecordsFromSomeListOrSomething
    

    그때...

    SELECT * FROM OtherTable
    WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )
    
  5. ==============================

    5.버전에 따라, 2008 년에 테이블 반환 매개 변수를 사용하거나 몇 가지 접근 방법은 여기에 설명 :

    버전에 따라, 2008 년에 테이블 반환 매개 변수를 사용하거나 몇 가지 접근 방법은 여기에 설명 :

    SQL Server 2005의 배열 및 목록

  6. ==============================

    6.당신은 문제의 데이터베이스 엔진을 지정하지 않았다; 오라클에서 옵션은 다음과 같이 사용 튜플이다 :

    당신은 문제의 데이터베이스 엔진을 지정하지 않았다; 오라클에서 옵션은 다음과 같이 사용 튜플이다 :

    테이블에서 SELECT * WHERE (골 1) IN ((123,1), (123,1), (222,1), ....)

    이 추한 해킹은 오라클 SQL에서 작동, https://asktom.oracle.com/pls/asktom/asktom.search?tag=limit-and-conversion-very-long-in-list-where-x-in# 참조 9538075800346844400

    그러나, 더 나은 옵션은 저장 프로 시저를 사용하여 배열로 값을 전달하는 것입니다.

  7. ==============================

    7.그것은 38,000 기록에 가까운 처리 할 수있는 것처럼 MS SQL 2016의 경우에로의 int를 통과, 그것은 보인다.

    그것은 38,000 기록에 가까운 처리 할 수있는 것처럼 MS SQL 2016의 경우에로의 int를 통과, 그것은 보인다.

    select * from user where userId in (1,2,3,etc)
    
  8. ==============================

    8.이 같은 튜플을 사용할 수 있습니다 : 테이블에서 SELECT * WHERE (골 1) IN ((123,1), (123,1), (222,1), ....)

    이 같은 튜플을 사용할 수 있습니다 : 테이블에서 SELECT * WHERE (골 1) IN ((123,1), (123,1), (222,1), ....)

    이들의 수에는 제한이 없습니다. 그것은 쌍을 비교합니다.

  9. from https://stackoverflow.com/questions/1069415/limit-on-the-where-col-in-condition by cc-by-sa and MIT license