我有一个包含100k行和20列的表,我希望根据该数据创建一个具有相同行数和列数的不同表,但是使用从第一个表和第二个表的前一列计算的数据。
例:
表A(具有列a1,a2,a3,a4,a5)是具有原始数据的表
表B(带有列b1,b2,b3,b4,b5)是带有计算数据的第二个表。
我想做的是(伪代码 - 计算更复杂):
UPDATE B
SET B.b2= A.a1*2,
B.b3= A.a2*A.a1,
B.b4= B.b1+B.b2,
B.b5= round(B.b4,2)
WHERE B.a1 = A.a1;
另一种方法可能是CTAS(Create Table As Select),但这不允许基于前一列创建列(我的意思是同时基于B.b3创建B.b4)
哪种方法更快?
PS1。我对CTAS的态度:
create table B NOLOGGING as
select a1 b1,
round(a2, 3) b2,
a3 b3,
b1+30 b4, --ORA 00904 b1 invalid identifier
a5 b5
from A;
答案 0 :(得分:1)
如果您想在不重复计算的情况下进行CTAS,可以使用子查询:
create table b (b1, b2, b3, b4, b5)
as
select t1, t2, t3, t1 + t2, round(t1 + t2, 2)
from (
select a1 as t1, a1*2 as t2, a2 * a1 as t3
from a
);
如果您有多个级别的依赖关系,那么您可以拥有多个子查询级别,在每个级别添加新的计算值:
create table b (b1, b2, b3, b4, b5)
as
select t1, t2, t3, t4, round(t4, 2)
from (
select t1, t2, t3, t1 + t2 as t4
from (
select a1 as t1, a1*2 as t2, a2 * a1 as t3
from a
)
);
您可以对update
或merge
使用相同的方法,但是您有两个通道,一个用于插入b1
值,另一个用于设置其他所有值基于它。我认为CTAS方法会更快更简单。