programing

WHERE 콜인(...) 조건에 대한 제한

muds 2023. 6. 25. 20:35
반응형

WHERE 콜인(...) 조건에 대한 제한

다음 코드를 사용하고 있습니다.

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

하지만, 만약 내가 ~3000개 이상의 숫자를 넣는다면.IN절, SQL에서 오류를 발생시킵니다.

혹시 사이즈 제한이나 이와 유사한 것이 있는지 아는 사람이 있습니까?!!

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

SQL Server에는 매우 큰 제한이 있습니다.

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

ORACLE은 다른 면에서 매우 쉽게 한계에 도달할 수 있습니다.

따라서 큰 IN 절의 경우에는 임시 테이블을 만들고 값을 삽입한 후 JOIN을 수행하는 것이 좋습니다.더 빨리 작동합니다.

제한이 있지만 값을 ()의 별도 블록으로 분할할 수 있습니다.

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

쿼리를 매개 변수화하고 테이블 값 매개 변수를 사용하여 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)

하위 선택에서 where를 수행하는 것이 어떻습니까?

임시 테이블에 사전 쿼리를 하는 것...

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

그러면...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )

버전에 따라 2008년에 표 값 매개 변수를 사용하거나 여기에 설명된 몇 가지 접근 방식을 사용합니다.

SQL Server 2005의 배열 및 목록

MS SQL 2016의 경우 in에 int를 전달하면 거의 38,000개의 레코드를 처리할 수 있을 것으로 보입니다.

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

저는 단순히 범위를 사용하여 이 문제를 해결했습니다.

WHERE Col >= 123 AND Col <= 10000

그런 다음 응용 프로그램 코드를 루프하여 지정된 범위의 원하지 않는 레코드를 제거합니다.어쨌든 레코드를 반복하고 있었고 수천 개의 레코드를 무시해도 아무런 차이가 없었기 때문에 잘 작동했습니다.

물론 이것은 보편적인 해결책은 아니지만 min과 max 내의 대부분의 값이 필요한 경우 상황에 적합할 수 있습니다.

문제의 데이터베이스 엔진을 지정하지 않았습니다. Oracle에서는 다음과 같은 튜플을 사용할 수 있습니다.

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

이 추악한 해킹은 Oracle SQL에서만 작동합니다. https://asktom.oracle.com/pls/asktom/asktom.search?tag=limit-and-conversion-very-long-in-list-where-x-in#9538075800346844400 을 참조하십시오.

그러나 저장 프로시저를 사용하고 값을 배열로 전달하는 것이 훨씬 더 좋습니다.

다음과 같은 튜플을 사용할 수 있습니다: SELECT * FROM table WHERE (색상, 1) IN ((123, 1), (123, 1), (222, 1)...)

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

언급URL : https://stackoverflow.com/questions/1069415/limit-on-the-where-col-in-condition

반응형