声明

2017-06-07 17 views
0
SELECT * FROM DIM_TRANS_TYPE WHERE TRANSACTION_TYPE='ILAU'; 

enter image description here声明

をマージ使用してOracleデータベース内のレコードをマージすることができません私はここに達成したいすべてが上記のレコードでInstant Finance Authorization RequestIFAUInstant Loan Authorization RequestILAUを変更です。

テーブルスキーマ:

Name     Null  Type    
--------------------- -------- ------------------ 
TRANSACTION_TYPE  NOT NULL VARCHAR2(4 CHAR) --> PRIMARY KEY 
TRANSACTION_TYPE_DESC   VARCHAR2(256 CHAR) 

WORKS!

MERGE INTO DIM_TRANS_TYPE a 
USING (SELECT 'ILAU' TRANSACTION_TYPE, 'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC FROM DUAL) b 
    ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE) 
WHEN MATCHED THEN UPDATE 
    SET 
     a.TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request' 
WHEN NOT MATCHED THEN 
    INSERT(a.TRANSACTION_TYPE, a.TRANSACTION_TYPE_DESC) 
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC); 

は動作しません! (エラー下図)

MERGE INTO DIM_TRANS_TYPE a 
USING (SELECT 'ILAU' TRANSACTION_TYPE, 'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC FROM DUAL) b 
    ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE) 
WHEN MATCHED THEN UPDATE 
    SET 
     a.TRANSACTION_TYPE = 'IFAU', 
     a.TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request' 
WHEN NOT MATCHED THEN 
    INSERT(a.TRANSACTION_TYPE, a.TRANSACTION_TYPE_DESC) 
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC); 

Error:エラーメッセージが示すように

Error at Command Line : 5 Column : 9 
Error report - 
SQL Error: ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."TRANSACTION_TYPE" 
38104. 00000 - "Columns referenced in the ON Clause cannot be updated: %s" 
*Cause: LHS of UPDATE SET contains the columns referenced in the ON Clause 
*Action: 
+0

DIM_TRANS_TYPEのスキーマを投稿してください – maSTAShuFu

+0

上記の投稿をテーブルスキーマ – user2325154

+3

で更新しました。エラーメッセージがクリアされています。 '。ドキュメントをチェックしてください。https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606 –

答えて

1

on句で使用されているフィールドを更新することは不可能です。

このような種類の更新は、別途記載する必要があります。このような何か:

UPDATE DIM_TRANS_TYPE 
SET TRANSACTION_TYPE = 'IFAU', 
     TRANSACTION_TYPE_DESC = 'Instant Finance Authorization Request' 
WHERE TRANSACTION_TYPE IN (
      SELECT TRANSATION_TYPE 
      FROM (SELECT 'ILAU' TRANSACTION_TYPE, 
          'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC 
        FROM DUAL) 
     ); 

MERGE INTO DIM_TRANS_TYPE a 
USING  (SELECT 'ILAU' TRANSACTION_TYPE, 
        'Instant Loan Authorization Request' TRANSACTION_TYPE_DESC 
      FROM DUAL) b 
     ON (a.TRANSACTION_TYPE = b.TRANSACTION_TYPE) 
WHEN NOT MATCHED THEN 
    INSERT(TRANSACTION_TYPE, TRANSACTION_TYPE_DESC) 
    VALUES(b.TRANSACTION_TYPE, b.TRANSACTION_TYPE_DESC); 

あなたはこれらのステートメントの両方またはどちらもどちらかが負担し、変更がコミットされるように、トランザクション内でこれを実行することをお勧めします。もちろん

、値は単にILAUと比較することができたようIN句は少し誇張されたように見えますが、私は実際にあなたからtransaction_type値を取得するための大きなデータセットを持っているとき、あなたが質問を簡素化を前提としています。

0

おそらく、私は何か....あなたがtransaction_type = 'ILAU'かかわらずtransaction_type_descの)すべての行を識別するために探しているようで、それらの行が'Instant Finance Authorization Request''IFAU'からtransaction_typetransaction_type_descを更新するために不足しています。右?

もしそうなら、なぜ些細なUPDATE以外の文が必要なのですか?既存の行のいずれもtransaction_type = 'ILAU'を持っていない場合は、行を挿入する - あなたの試みにおいて

update dim_trans_type 
    set transaction_type  = 'IFAU', 
     transaction_type_desc = 'Instant Finance Authorization Request' 
    where transaction_type  = 'ILAU' 
; 

when not matched句があります。それはあなたの要求にどのように関連していますか?あなたは言った私がここで達成したいのは変更です[.....] - 何も挿入の言及はありません。問題文は、単純な英語では不完全ですか?または、挿入する必要のないものを挿入していますか?