2016-11-23 4 views
0

有効開始日をSCD2ディメンションに変更すると、関数をupdateに使用しようとしています。私は、PKに基づいてテーブルを自己結合するためにサブクエリを使用しようとしています。更新は前の終了日に基づいて更新されず、代わりに既定値(それ自体)に更新されます。デフォルトの値を削除すると、有効な開始日をnullにできないため、エラーが発生します。私がちょうどselectを使用するとき、私は望ましい結果を得る。遅延機能を使用したOracle Update

ご協力いただければ幸いです。

update schema.d_account ac1 
set effective_start_dt = (select lag(effective_end_dt, 1, effective_start_dt) over(partition by id order by effective_end_dt asc) 
          from schema.d_account ac2 
          where ac1.account_dim_key = ac2.account_dim_key), 
audit_last_update_dt = sysdate, 
where id in '0013600000USKLqAAP' 

表:

enter image description here

望ましい結果:

enter image description here

+0

あなたは私たちにあなたが得たエラーを教えてください?私はここでクエリの問題は表示されません。 –

+1

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

答えて

0

あなたの更新が機能しない理由これらの理由の一つがあるかもしれません。私はあなたのテーブルの正確な構造を知らない。あなたはサンプルデータを提供していません。あなたの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_dteffective_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; 
+0

私は最初に置き換えられましたこれはテーブルのPKなので、ROWIDはacocunt_dim_keyですが、これはパフォーマンスに影響します(100Kレコードを更新するのに1時間以上かかる)が、ROWIDを使用して上記のクエリを実行すると、サブクエリが1行以上を返すというエラーが発生します。 ROWIDはどのように使用できますか? ROWIDを使用 – gisr

+0

更新はdexwhsからRID としてprev_dt としてdexwhs.d_account_veeva AC1 セットeffective_start_dt =(effective_start_dtによってID順によってパーティション(上 (セレクト遅れ(effective_end_dt、1、effective_start_dt)からaccount_dim_keyをprev_dtを選択)、ROWIDを更新します。 d_account_veeva ac2)a a.rid = ROWID)、 audit_last_update_dt = sysdate – gisr

+0

account_dim_keyを使用して更新:update dexwhs。d_account_veeva AC1 セットprev_dt としてeffective_start_dt =(effective_end_dt ASCによるIDの順序によって(パーティション上 (セレクト遅れ(effective_end_dt、1、effective_start_dt)からprev_dtを選択)、dexwhs.d_account_veeva AC2から RIDとしてaccount_dim_key)A a.rid = account_dim_key)、 audit_last_update_dt = sysdate – gisr

関連する問題