2017-09-11 24 views
1

我正在使用Teradata執行以下操作。 說我有以下表1優化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 

我想加入表1和表2(將3次),這樣我可以創建這樣

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 

我可以用下面的代碼創建這個表格

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爲空,col4將爲空。 col2和col5不會爲空。所以如果col3爲空,我會有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不會爲空。所以如果col3爲空,我會有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

感謝羅布......似乎適合堆棧溢出。 –