2016-12-08 6 views
2

私の使用のために新しい表を作成しました。これには8列のt1があります。私はプロシージャを介して3つの列に値を設定しました。列1は名前です。今度は、対応する名前の4番目の列に値を設定します。これはwhere句で更新されます。別の表から1つの表を更新する

このシナリオでは、名前とtotal_amountを持つt2を呼び出す結果を持つクエリを作成しました。今度は、total_amountをt1の4番目の列に設定します。

私が今行っているアプローチは、t1の各名前をループし、t2(句付き)のカウンタtotal_amountを見つけてt1の値を更新することです。しかし、それは無限の時間を費やしている。第1に、t1のルーピングのためです。第2に、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

ここでMySQL、MS SQL ServerまたはOracleを使用していますか?関与していない製品にタグを付けないでください。 – jarlh

+0

スキーマで表を表現できますか? – anatol

+0

@jarlhここでOracleを使用しています。申し訳ありませんタグの – Akshay

答えて

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; 

。なぜあなたは直接あなたがそうすることができません:

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

関連する問題