以下のように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つのクエリに分割しようとすると、うまくいきます。
上記で作成したテーブルを使用して、次のように更新します。
update final_table
set(destination_col1,destination_col2)=
(select c4,c5 from step1_table where c6=final_table.primary_key)
提案されたように ここ で、ロックがないかどうかを確認しようとしました。しかし、私にはありません。
with statement
を悪用していますか?なぜ私の期待が正確に満たされないのですか?
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;