Sql 基于另一个表中的数据快速更新或创建表

Sql 基于另一个表中的数据快速更新或创建表,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个包含100k行和20列的表,我希望根据该数据创建一个不同的表,该表包含相同数量的行和列,但包含从第一个表和第二个表的前几列计算的数据 示例: 表A(包含a1、a2、a3、a4、a5列)是包含原始数据的表。 表B(包含b1、b2、b3、b4、b5列)是第二个包含计算数据的表。 我想做的是(伪代码-计算更复杂): 另一种方法可以是CTA(创建表为Select),但这不允许基于前一列创建列(我的意思是同时基于B.b3创建B.b4) 哪种方法更快 PS1。我的CTA方法: create tabl

我有一个包含100k行和20列的表,我希望根据该数据创建一个不同的表,该表包含相同数量的行和列,但包含从第一个表和第二个表的前几列计算的数据

示例:
表A(包含a1、a2、a3、a4、a5列)是包含原始数据的表。
表B(包含b1、b2、b3、b4、b5列)是第二个包含计算数据的表。
我想做的是(伪代码-计算更复杂):

另一种方法可以是CTA(创建表为Select),但这不允许基于前一列创建列(我的意思是同时基于B.b3创建B.b4)

哪种方法更快

PS1。我的CTA方法:

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;

如果要在不重复计算的情况下执行CTA,可以使用子查询:

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


您可以对
更新
合并
使用相同的方法,但是您有两个过程,一个是自己插入
b1
值,另一个是基于它设置所有其他内容。我认为,CTA方法将更快、更简单。

您是否考虑过具体化的观点?在这种情况下,甚至是正常视图?或者只是将额外的列作为虚拟列添加到原始表中?我不确定您是希望第二个表与第一个表保持同步,还是希望它是单个时间点上数据的一次性快照。它是数据的一次性快照。我不熟悉这些观点。你能更详细一点吗?但是一个一次性的快照,或者你想保持同步的东西——要么在原始更改时立即更新(在这种情况下,为什么是一个单独的表),要么定期更新?
更新
表明它当然不是一次性的……我不想保持同步。这是一次计算。你的意思是B.b4=B.b1+B.b2吗?我试过了。它不起作用。我得到一个错误ORA 00904 B.b1无效标识符让我试试这个方法,我会让你知道的。谢谢
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
  )
);