我创建了一个供我使用的新表,让我们说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;
/
答案 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))?