2008-10-30 5 views
0

훨씬 더 큰 테이블에서 특정 데이터를 추출하는 스크립트가 있습니다. 특히 한 필드가 특히 규칙적으로 변경됩니다.깃발에 따라 SQL을 통해 다른 테이블에서 선택

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
     THEN t.field3 END as field, 
     ...[A bunch of other fields] 
FROM table t 

그러나 이제 데이터에 대한 다른 처리 작업을 수행하려고합니다. 가장 효과적인 방법을 찾으려고합니다. 깃발을 가져올 방법이 필요합니다. 오른쪽 필드로 잘라낸 데이터에 대해 이야기하고 있습니다.

(대부분 무슨 일이 일어날 지 알기 위해) 약간 놀랐던 가능한 해결책 중 하나는 스크립트의 내용을 전달 된 플래그가있는 테이블 함수로 덤프 한 다음 함수의 결과 나는 그것을 작동시킬 수 있었지만, 그것보다 현저히 느리다 ...

분명히 알 수있는 해결책은 프로세서 사이클을 가장 효율적으로 사용하는 것이다. 플래그 값. 그러나 문제는 계산을 수행하기 위해 올바른 캐시 테이블에서 데이터를 추출하는 몇 가지 방법을 찾는 것입니다. 이는 나의 의도 한 결과 모든 - 잘못된하지만, 명백한 응답은 알 수있는 바와 같이

SELECT CASE @Flag WHEN 1 THEN table1.field WHEN 2 THEN table2.field WHEN 3 
     THEN table3.field END as field, 
     ...[The various calculated fields] 
FROM table1, table2, table3 

불행하게도,이 거대한 크로스 조인을 생성 뭔가

처럼 될 것입니다.

누군가가 "x 테이블 만보기"로 크로스 조인을 전환하는 방법을 알고 있습니까? (동적 SQL을 사용하지 않으면 어떤 일을 처리하기가 어렵습니까?) 아니면 대안적인 해결책은 여전히 ​​합리적으로 빠릅니까?

편집 : 좋은 이유가 아니건간에 구현하려고 시도한 아이디어는 크게 테이블이 다른 3 가지 쿼리를 사용하지 않는 것이 었습니다. 변경 될 때마다 똑같이 편집해야했습니다. 논리. 그래서 나는 지금까지 "플래그가 완전히 분리되어있다"는 것을 피했습니다 ...

+0

이 질문을 하나의 쿼리로 만드는 데 드는 노력은 작업을 완료하는 데 더 효과적입니다. –

답변

0

간단한 해결책, 그리고 직장 동료에 의해 제안 하나를

SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3 
    THEN t.field3 END as field, 
    [A bunch of other fields], 
    @Flag as flag 
FROM table t 

그런 다음 마지막 필드에서 의사 결정의 기준. 훨씬 간단하고 아마 처음에 나에게 일어 났어야 했어.

5

@Flag을 쿼리에서 빼내어 세 개의 분리 된 SELECT 문 중 하나를 결정해야한다고 생각합니다. 운영.

+0

당신이 질문을하는 경우 당신이 거기에 보여준 것처럼 간단합니다 ... 이것은 정말 최고의 대답입니다. –

0

해결해야 할 문제보다는 기술에 관심을 기울이는 것처럼 보입니다. 각 사례에 대한 메인 테이블에서 하나를 선택하십시오 - 당신이 그것을 여기에 설명하는 방법입니다, 그렇죠?

3

각 FLAG 값에 대해 UNION ALL은 어떻습니까? 첫 번째 비트의 WHERE 절에서

은 다음과 같습니다 : 다른 플래그 값에 대해 서로 다른 선택 문을 실행하는 방법에 대한 코멘트는 나에게 의미가

AND @flag = 1 

있지만.

+0

UNION ALL을 사용하여 이런 방식으로 해결하면 Margaret이 피하려고했던 SQL 쿼리의 대부분을 반복하는 것을 의미합니다. –

관련 문제