2017-09-11 12 views
1

Teradata를 사용하여 다음 작업을 수행하고 있습니다. 내가 다음 표Teradata 최적화 다중 테이블 조건부 조인 쿼리

col1 col2 col3 col4 col5 
1  A NULL NULL D 
2  B NULL NULL C  
3  A B  NULL D 
4  A B  C  D 

및 표 2

col1 col2 col3 col4 
1  A D 27 
2  B C 334  
3  A B 434 
4  B D 100 
5  C D 200 

은 내가이

col1 col2 col3 col4 col5 col_val_1 col_val_2 col_val_3 
1  A NULL NULL D  27   NULL  NULL 
2  B NULL NULL C  334   NULL  NULL 
3  A B  NULL D  434   100  NULL 
4  A B  C  D  434   334  200 
같은 테이블을 만들 수 있도록 표 1과 표 2 (3 회 예정) 가입하려는 말해봐

이 테이블을 다음 코드로 생성 할 수 있습니다.

select tab1.*, tab2_1.col4 as col_val_1, tab2_2.col4 as col_cal_2, tab2_3.col4 as col_val_3 
from Table1 tab1 
left outer join Table2 tab2_1 
on tab2_1.col2 = tab1.col2 
and tab2_1.col3 = coalesce(tab1.col3,tab1.col5) /* if col3 is Null then join on col5. I want to calculate pair wise value. If col3 is NULL, the pair is col2-col5.*/ 
left outer join Table2 tab2_2 
on tab2_2.col2 = coalesce(tab1.col3,0) 
and tab2_2.col3 = coalesce(tab1.col4, tab1.col5) 
left outer join Table2 tab2_3 
on tab2_3.col2 = coalesce(tab1.col4,0) 
and tab2_3.col3 = tab1.col5 

Table1 데이터는 col3이 null이면 col4가 null이 될 것입니다. col2와 col5는 결코 null이 아닙니다. 따라서 col3이 null이면 col2-col5를 갖습니다. col3가 null이 아니고 col4가 null이면 col2-col3, col3-col5를 갖습니다. 아무것도 null 인 경우 col2-col3, col3-col4, col4-col5가됩니다.

이 쿼리는 작은 테이블에 대해 실행되며 원하는 출력을 제공합니다. 그러나 이것은 복잡한 쿼리입니다. 이 경우 EXPLAIN을 실행했으며 예상 런타임은 >10^5 시간입니다. 방법이 있는지 궁금 해서요. 이 쿼리는 최적화 될 수 있습니다.

+1

'켜기'조항으로 달성하고자하는 바를 설명하기 위해 질문을 편집하십시오. 그것들을 단순화하면 성능이 크게 향상 될 것입니다. 특히, 'ON ... tab2_3.col2 = coalesce (tab1.col4,0)'의 목적은 신비합니다. –

+0

MySQL 또는 Teradata를 사용하고 있습니까? –

+0

조인에 대한 설명으로 질문을 업데이트했습니다. Table1 데이터는 col3이 null이면 col4가 null이 될 것입니다. col2와 col5는 결코 null이 아닙니다. 따라서 col3이 null이면 col2-col5를 갖습니다. col3가 null이 아니고 col4가 null이면 col2-col3, col3-col5를 갖습니다. 아무것도 null 인 경우 col2-col3, col3-col4, col4-col5가됩니다. – deepAgrawal

답변

2

일반적으로 실제로은 조인 조건에서 기능을 사용하지 않으려합니다. 주변을 둘러 볼 수 없다면 디자인 결함이 나타날 수 있습니다. 이것은 두 테이블을 결합해야하는 기이 한 방법입니다.

그러나 공이 법원에없는 상태에서 그 공이 붙어 있다면 성능이 향상 될 수 있습니다. 내 직감은 제품 가입이 어딘가에서 일어나고 있다는 것입니다.

정말 무거웠습니다.

CREATE MULTISET VOLATILE TABLE Table1 AS tab1 
    (SELECT col1, 
      col2, 
      col3, 
      col4, 
      col5, 
      COALESCE(tab1.col3,tab1.col5) AS col_35, 
      COALESCE(tab1.col4,tab1.col5) AS col_45, 
      COALESCE(tab1.col3,0) AS col_30, 
      COALESCE(tab1.col4,0) AS col_40 
     FROM Table1 
) 
WITH DATA PRIMARY INDEX (col2) ON COMMIT PRESERVE ROWS; 

SELECT tab1.*, 
     tab2_1.col4 AS col_val_1, 
     tab2_2.col4 AS col_cal_2, 
     tab2_3.col4 AS col_val_3 
    FROM tab1 
    LEFT 
    JOIN Table2 AS tab2_1 
    ON tab2_1.col2 = tab1.col2 
    AND tab2_1.col3 = tab1.col_35 
    LEFT 
    JOIN Table2 AS tab2_2 
    ON tab2_2.col2 = tab1.col_30 
    AND tab2_2.col3 = tab1.col_45 
    LEFT 
    JOIN Table2 AS tab2_3 
    ON tab2_3.col2 = tab1.col_40 
    AND tab2_3.col3 = tab1.col_5; 
+0

좋은 사용자 이름입니다. :) –

+0

감사합니다 Rob ... Stack Overflow에 적합한 것 같았습니다. –