优化Teradata Query多表条件连接

时间:2017-09-11 16:39:00

标签: sql teradata

我正在使用Teradata执行以下操作。 说我有以下表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

我想加入Table1和Table2(将是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为null,则col4将为null。 col2和col5永远不会为空。因此,如果col3为null,我将使用col2-col5。如果col3不为null且col4为null,那么我将使用col2-col3,col3-col5。如果什么都没有,那么我将有col2-col3,col3-col4,col4-col5。

此查询针对小表运行并提供所需的输出。但是,这是一个复杂的查询。我对此运行EXPLAIN,估计运行时间为>10^5小时。我想知道是否有办法。可以优化此查询。

1 个答案:

答案 0 :(得分: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;