2012-09-19 2 views
4

일부 조인 된 테이블에서 여러 개의 열을 선택하는 SELECT 절이있는 저장 프로 시저를 만들고 있습니다. 이 열 중 하나의 값은 CASE 조건에 따라 다릅니다.데이터 검색 중 LocalVariable SELECT - SQL

SELECT DISTINCT 
table1.col1 as var1, 
table2.col2 as var2, 
CASE WHEN (FLOOR(table3.col3/0.2)*0.2) > 20 THEN 20 
     WHEN (FLOOR(table3.col3/0.2)*0.2) <= 20 THEN FLOOR(table3.col3/0.2)*0.2 
     ELSE table3.col4 -- selecting another value is the 
         -- value in table3.col3 is null 
     END as var3 
FROM ... 
WHERE ... 

당신은 내가 세 번 FLOOR (table3.col3/0.2) * 0.2 계산을하고있어 선택에서 볼 수 있듯이. 이 계산 된 값을 SELECT 내의 변수에 저장 한 다음 조건에서이 변수를 사용할 수 있습니까? 사전에

감사합니다,

제론

답변

1

아니요, 다음과 같이 2 통화로 줄일 수 있습니다. 그러나 당신이 할 일이 무엇이든간에 비용이 많이 드는 일이 될 것입니다. 실제로 그렇게하는 것은 당신이하는 일이 매우 빠르기 때문입니다. 실제로 무거운 작업을 할 때 개선 할 것이 있다고 생각할 수 있습니다. 이것은 단지 아무것도 아닙니다. 당신은 또한 get_min 함수를 만들지 만 다시는 그럴 가치가 있다고 생각하지 않습니다.

2 사용한 통화 : 분 기능으로

case when table3.col3 then table3.col4 
    when (FLOOR(table3.col3/0.2)*0.2) > 20 THEN 20 
    else FLOOR(table3.col3/0.2)*0.2 
end 

: 사이드 참고 I 내장되어야 참조하고 최소 기능 (사용자 정의 함수)로서

case when table3.col3 then table3.col4 
    else dbo.get_min(FLOOR(table3.col3/0.2)*0.2,20) 
end 

.

+0

쿼리가 많은 수의 데이터 (즉, 수천 개의 행)를 검색하는 경우 여전히이 방법이 더 빠릅니까? – coussej

+0

저는 수천 명이 당신의 공연에 큰 영향을 미칠 것이라고 생각하지 않습니다. 그것은 서버에 달려 있지만 계산은 쉽지 않습니다. 그래서 나는 당신이 실제적인 개선을 보게 될지 의심 스럽습니다. –

0

table3에서 테이블 참조 내에서 선택하여이 작업을 수행 할 수있는 방법은 당신이 할 수있는 대신 ... FROM table3의,있다 :

SELECT ... 
CASE WHEN (t3.flooredCol3) > 20 THEN 20 
    WHEN (t3.flooredCol3) <= 20 THEN t3.flooredCol3 

.... 
FROM 
(
    SELECT col1, ..., 
     FLOOR(table3.col3/0.2) * 0.2 AS flooredCol3 
    FROM table3 
) t3 
-- the rest of the table references 
0

을 하위 쿼리를 수행 할 수 있습니다.

SELECT 
     *, FloorCalc 
    FROM 
    (select *, (FLOOR(table3.col3/0.2)*0.2)) as FloorCalc from table3 ...) v 

그러나 쿼리 최적화 프로그램이 자동으로 계산 결과를 캐시 할 수 있습니다.

관련 문제