あなたの更新が機能しない理由これらの理由の一つがあるかもしれません。私はあなたのテーブルの正確な構造を知らない。あなたはサンプルデータを提供していません。あなたのaccount_dim_keyは、各行の一意であれば、select lag() ... from schema.d_account ac2 where ac1.account_dim_key = ac2.account_dim_key)
は、1行が返されますし、あなたのaccount_dim_keyはあなたが持っているすべてのこれらの行で同じである場合は、効果的に
(ラグ機能のデフォルト値である)effective_start_dt
にeffective_start_dt
を更新しますサンプルとして提供された場合、select lag() ... from schema.d_account ac2 where ac1.account_dim_key = ac2.account_dim_key)
は複数の行を戻し、OracleはUPDATEが不可能であると訴えます(特定のエラー・メッセージがありますが、正確な表現は覚えていません)。
問合せを使用するには別のアプローチ:
update schema.d_account ac1
set effective_start_dt = (select prev_dt from
(select lag(effective_end_dt, 1, effective_start_dt) over(partition by id order by effective_end_dt asc) as prev_dt
, ROWID as rid
from schema.d_account ac2) a where a.rid = ROWID),
audit_last_update_dt = sysdate,
where id in '0013600000USKLqAAP'
したがって、基本的に、前の日付を作成するROWID列を持つ副問合せa
があります。 UPDATEステートメントの場合、このサブクエリーにROWIDを結合します。
注:お使いのaccount_dim_keyは、各行ごとに一意である場合は、ROWIDの代わりにそれを使用することができます:あなたは
UPDATEあなたのテーブルを持っているインデックスに応じて、より良いパフォーマンスを得ることができます:上記のクエリはあなたを与える可能性がありパフォーマンスが悪い以下のMERGEステートメントを使用する方がよいでしょう:
MERGE INTO (SELECT id, effective_start_dt, ROWID rid, audit_last_update_dt
FROM schema.d_account WHERE id in '0013600000USKLqAAP') ac1
USING (select lag(effective_end_dt, 1, effective_start_dt) over(partition by id order by effective_end_dt asc) as prev_dt
, ROWID as rid
from schema.d_account) ac2
ON (ac1.rid = ac2.rid)
WHEN MATCHED THEN UPDATE SET ac1.effective_start_dt = ac2.prev_dt,
ac1.audit_last_update_dt = sysdate;
出典
2016-11-23 03:05:32
cha
あなたは私たちにあなたが得たエラーを教えてください?私はここでクエリの問題は表示されません。 –
http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –