2017-09-11 10 views
1

私はTeradataを使用して以下を実行しています。 は、私は私がこのTeradataを最適化する複数テーブルの条件付き結合を照会する

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倍になります)参加したい、次の表1

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 

を持っていると言います

このテーブルは次のコードで作成できます

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」節で達成したいことを説明するために質問を編集してください。それらを単純化することは、おそらく多くのパフォーマンスを助けるでしょう。特に、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

一般に実際にはは、結合条件の機能を回避したいと考えています。あなたがそれを回避できない場合、それは設計上の瑕疵に遭遇する可能性があります。これは、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に適しているようです。 –

関連する問題