私は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
時間にあります。私は方法があるかどうか疑問に思っていた。このクエリは最適化できます。
「ON」節で達成したいことを説明するために質問を編集してください。それらを単純化することは、おそらく多くのパフォーマンスを助けるでしょう。特に、ON ... tab2_3.col2 = coalesce(tab1.col4,0)の目的は神秘的です。 –
MySQLまたはTeradataを使用していますか? –
私は、ジョインの説明で質問を更新しました。 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