根据另一个表中的数据快速更新或创建表

时间:2014-05-02 08:46:46

标签: sql oracle oracle11g

我有一个包含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;

1 个答案:

答案 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
);

SQl Fiddle

如果您有多个级别的依赖关系,那么您可以拥有多个子查询级别,在每个级别添加新的计算值:

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
  )
);

Another Fiddle

您可以对updatemerge使用相同的方法,但是您有两个通道,一个用于插入b1值,另一个用于设置其他所有值基于它。我认为CTAS方法会更快更简单。