4

他の列や他のテーブルからの値の比較に基づいて、closed_date列の値を更新したいと思います。Oracleのmergeintoステートメントを使用しました。しかし、それは私にエラーを与えました:

エラー:ORA-00969:ONキーワードがありません

何が悪いのかわかりません。私は何かが恋しいですか?以下は私のスクリプトです:

MERGE INTO PR_DMN dmn
USING (select alg.PR_DMN_ID, alg.PR_ACTIVITY_ID, alg.ACTIVITY_TS from PR_ACTIVITY_LOG) alg
ON dmn.PR_DMN_ID = alg.PR_DMN_ID
-- update
WHEN MATCHED THEN
UPDATE SET dmn.CLOSED_DATE =
    (CASE 
        WHEN alg.PR_ACTIVITY_ID IN ('10009', '10010', '10011', '10013') THEN alg.ACTIVITY_TS
        WHEN alg.PR_ACTIVITY_ID = '10005' AND dmn.CONT_RESP_TS <= dmn.CONT_RESP_DUE_TS THEN dmn.CONT_RESP_TS 
        WHEN alg.PR_ACTIVITY_ID = '10008' AND dmn.CORR_RESP_TS <= dmn.CORR_RESP_DUE_TS THEN dmn.CORR_RESP_TS
        ELSE dmn.CLOSED_DATE 
    END)
4

1 に答える 1

6

簡単な例でわかるように、2つのエラーがあります。まず、on句を括弧で囲む必要があります。using次に、そのサブクエリ内の句でサブ選択のエイリアスを参照することはできません。

次のようにテーブル名を使用して簡単な例を設定した場合:

create table pr_dmn as
 select level as a, sysdate as b
   from dual
connect by level <= 10;

Table created.


create table PR_ACTIVITY_LOG as
 select level as a, sysdate as b
   from dual
connect by level <= 20;

Table created.

次に、動作するはずの正しいクエリを実行します。

merge into pr_dmn dmn
 using (select a, b from pr_activity_log) alg -- no alg. inside the sub-query
    on (dmn.a = alg.a) -- wrapped in parenthesis
  when matched then
update set dmn.b = alg.b
       ;

10 rows merged.

ドキュメントにもいくつかの良い例がありますが、私は常にPSOUGがこのようなものの良いリファレンスだと思っています。

于 2012-07-09T17:27:15.087 に答える