web-dev-qa-db-ja.com

with句を使用するOracle更新ステートメントは永遠にかかります

以下のようにwithステートメントの一連の集計結果を利用するupdateステートメントを記述しようとしています。

update final_table
set(destination_col1,destination_col2)=
(
select c4,c5
from
(
  with temp_table1(c1,c2,c3) as
  select c7,c7,c9 from source_table,

  temp_table2(c4,c5,c6) as
  select "some aggregation on c1,c2",c3 from temp_table

  select * from temp_table2
)
where c6= final_table.primary_key
);

これは永遠に実行されます。

一方、同じものを2つのクエリに分割しようとすると、うまくいきます。

  1. 内部クエリを使用してテーブルを作成します。
  2. 上記で作成したテーブルを使用して、次のように更新します。

    update final_table
        set(destination_col1,destination_col2)=
        (select c4,c5 from step1_table where c6=final_table.primary_key)
    

提案されたように ここ で、ロックがないかどうかを確認しようとしました。しかし、私にはありません。

with statementを悪用していますか?なぜ私の期待が正確に満たされないのですか?

1

Withステートメントを悪用していますか?

いいえ、UPDATEステートメントを悪用しています。 UPDATEステートメントを使用すると、final_tableの各行に対して相関サブクエリが実行されます。

他のテーブルの値を更新するには、通常、MERGEを使用します。

例:

merge into final_table using
(
select c4,c5,c6
from
(
  with temp_table1(c1,c2,c3) as
  select c7,c7,c9 from source_table,

  temp_table2(c4,c5,c6) as
  select "some aggregation on c1,c2",c3 from temp_table

  select * from temp_table2
)
) inner
on inner.c6 = final_table.primary_key
when matched then update set final_table.destination_col1 = inner.c4, 
                             final_table.destination_col2 = inner.c5;
2
Balazs Papp