我正在使用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
小时。我想知道是否有办法。可以优化此查询。
答案 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;