从另一个表更新一个表

时间:2016-12-08 09:03:34

标签: sql oracle

我创建了一个供我使用的新表,让我们说t1中有8列。我通过一个程序填充了3列。第1列是名称。现在我想在第4列填充相应的名称。这将使用where子句进行更新。

该场景是我创建了一个具有结果的查询,调用具有name和total_amount的t2。现在我想将total_amount填充到t1的第4列。

我现在正在遵循的方法是循环遍历t1中的每个名称,并在t2(with子句)中查找其计数器total_amount并更新t1中的值。但这需要无限的时间。首先是因为在t1中循环,其次t2本身就是一次又一次执行的查询。

现在,实际任务要复杂得多,我刚刚提到了它的关键。请建议我一个快速的方法。

create or replace procedure proc
is

temp_value number(18,2);

CURSOR total is
select name, age, sex from data_table where
{conditions};

/*Gives me name and age in 1st and 2nd column and likewise data in 3rd column */

begin

FOR temp IN total LOOP

    with aa as (SELECT b.name,
         NVL (SUM (c.amount), 0) as total_amount
    FROM data_table2 b, data_table3 c
   WHERE     {joins and groub by}
   )
   /* This gives me total amount for corresponding name. There is no repetition of name */

   select nvl(sum(total_amount),0) into temp_value from aa where name = temp.name;

    update t1 set amount = temp_value where name = temp.name;

    END LOOP;

END;
/

1 个答案:

答案 0 :(得分:0)

无法在问题中添加评论,因此请将其放在此处。

根据你的例子:

    with aa as (SELECT b.name,
     NVL (SUM (c.amount), 0) as total_amount
FROM data_table2 b, data_table3 c
WHERE     {joins and groub by}
)
/* This gives me total amount for corresponding name. There is no repetition of name */

select nvl(sum(total_amount),0) into temp_value from aa where name = temp.name;

update t1 set amount = temp_value where name = temp.name;

在你的with子句中,你取一些总和,然后为光标中的所有名称填充这些总和的总和。为什么你不能直接做:

    SELECT SUM(NVL(total_amount, 0)) INTO temp_vale FROM
       data_tabl1, data_tabl2, data_tabl3
       WHERE
        --JOIN CONDITIONS
      AND data_tabl1.total)name = --data_tabl2/3.name
    GROUP BY --clause;

为什么我这样说,条款并不总是一个好主意。如果你的'with'拥有庞大的数据,那么它将永远运行。 'With'用于处理重复的表,一次又一次地连接小数据。

另外,为了调整目的,请尝试一些提示。

另外,NVL(SUM ..)为什么不SUM(NVL(total_amount,0))?