2013-07-11 2 views
2

귀하의 조언이 필요합니다. 이 모든 값이 잘 보이지 않습니다으로많은 정보가 포함 된 가치 - TSQL

CASE 
    WHEN PLAN_GIVEN IN (this list contains 1700 values to compare) THEN 'P1' 
    WHEN PLAN_GIVEN IN (this list contains 1800 values to compare) THEN 'P2' 
    ELSE NULL 
END AS PLAN_NAME 

내가 모두 1,700 값 IN () THEN 'P1'을 나열 할 수 없습니다 :

는이 같은 내 T-SQL 쿼리에 CASE 문이있다.

은 내가 lookup_table

같은
lookup_table 

columnA = all 1700 values     
columnB = all 1800 values 

에 1700 개 값 1800 개 값을 절약 노력이 쿼리를 사용 : 위의 코드가 작동되지만

CASE 
    WHEN PLAN_GIVEN IN (SELECT columnA from lookup_table) THEN 'P1' 
    WHEN PLAN_GIVEN IN (SELECT columnB from lookup_table) THEN 'P2' 
    ELSE NULL 
END AS PLAN_NAME 

거의 10을 실행하는 데 더 많은 시간이 걸리는를 실행을 완료하는 데 몇 분.

이렇게하려면 다른 방법이 있습니까? , 또는

CASE 
    WHEN EXISTS (SELECT NULL from lookup_table WHERE PLAN_GIVEN = columnA) 
     THEN 'P1' 
    WHEN EXISTS (SELECT NULL from lookup_table WHERE PLAN_GIVEN = columnB) 
     THEN 'P2' 
ELSE NULL 
END AS PLAN_NAME 

을 조회 테이블에 가입하고 CASE 표현에 조회 값을 비교하려고 :

+1

1700 값은 어디에서 오는가? 애플리케이션에서 오는 경우 테이블 값 매개 변수로 전달할 수 있습니다. 또는 표에 열을 추가하고 한 번 업데이트 할 수 있습니다. 기준과 일치하는 모든 행에 대해 true로 설정할 수 있습니다.자, 이제까지 유지되는 한, 귀하의 질의는 이제 단지 IsInThisCrazyList = 1이라고 말할 수 있습니다. –

+0

Aaron !! 이 값은 어떤 응용 프로그램에서도 가져 오지 않습니다. 고객이 쿼리와 비교할 값을주었습니다. 기존 테이블의 구조를 변경할 수 없으므로 테이블 반환 매개 변수를 사용하려고합니다. –

답변

3

대신 PLAN_GIVEN IN를 사용하는 EXISTS를 사용해보십시오

SELECT ... 
     CASE PLAN_GIVEN 
      WHEN lookup_table.columnA THEN 'P1' 
      WHEN lookup_table.columnB THEN 'P2' 
      ELSE NULL 
     END AS PLAN_NAME 
     ... 
FROM ... 
LEFT JOIN lookup_table 
    ON PLAN_GIVEN IN (lookup_table.columnA, lookup_table.columnB) 
+0

답변 해 주셔서 감사합니다. 나는 너의 것의 첫번째 방법을 사용하여 더 많은 시간을 아직도 가졌다. 두 번째 방법을 시도하고 있습니다. 다시 한 번 감사드립니다! –

0

가치

시도
select 'P1' 
from table 
where PLAN_GIVEN IN (this list contains 1700 values to compare) 
union 
select 'P2' 
from table 
where PLAN_GIVEN IN (this list contains 1800 values to compare) 

PLAN_GIVEN ha 인덱스에 다음 인덱스를 사용할 수 있습니다.
CASE에서 색인을 사용할 수 있다고 생각하지 않습니다.

어쩌면 TVP보다는

1

먼저 사용했다 @MarkBannister 솔루션 중 하나. 두 번째는 lookup_table의 각 열에 인덱스를 넣습니다.

CREATE INDEX IX_lookup_table_A ON lookup_table(columnA) 
CREATE INDEX IX_lookup_table_B ON lookup_table(columnB) 

하더라도 lookup_table은 여전히 ​​가치가 인덱스를 추가 할 수있는 시간이 임시 테이블입니다. 그리고 그것이 정적 인 테이블이라면 그 시간만큼 가치있는 것입니다.

3

나는 이런 식으로 조회 테이블을 변경할 것 :

Value Name 
----- ---- 
123 P1 
456 P1 
... ... 
789 P2 
... ... 

Value에 클러스터 된 인덱스.

그 후, 당신은 단순히 LookupTable.Value = otherTable.PLAN_GIVEN에 조회 테이블을 외부에 가입 할 수 있습니다 그냥 SELECT 절, 즉에 LookupTable.Name을 끌어 이런 식으로 뭔가 :

SELECT 
    ... 
    lookup.Name AS PLAN_NAME, 
    ... 
FROM 
    ... 
    LEFT OUTER JOIN LookupTable lookup ON lookup.Value = otherTable.PLAN_GIVEN 
WHERE... 
... 

I가 조회 값을 믿고있어주의하시기 바랍니다 고유 한 것인데, CASE 표현식에서 어떻게 처리했는지는 당연한 것 같습니다.

관련 문제