sql >> データベース >  >> RDS >> Oracle

Oracleのキー保存ビューのように見える更新により、ORA-01779が発生します

    ターゲットにヘルパー列を導入することで、OracleにMERGEを実行するように「説得」することができました:

    MERGE INTO (SELECT (SELECT t.account_no FROM dual) AS account_no_temp,
                        t.account_no, t.contract_id 
                FROM t) t
    USING (
      SELECT u.account_no_old, u.account_no_new, v.contract_id
      FROM u, v
      WHERE v.tenant_id = u.tenant_id
    ) s
    ON (t.account_no_temp = s.account_no_old AND t.contract_id = s.contract_id)
    WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;
    

    db<>フィドルデモ

    編集

    上記のアイデアのバリエーション-サブクエリは直接ONに移動しました パート:

    MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
    USING (
          SELECT u.account_no_old, u.account_no_new, v.contract_id
          FROM u, v
          WHERE v.tenant_id = u.tenant_id
        ) s
    ON ((SELECT t.account_no FROM dual) = s.account_no_old
         AND t.contract_id = s.contract_id)
    WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;
    

    db <> fiddle demo2

    関連記事:ON句で参照されている列は更新できません

    編集2:

    MERGE INTO (SELECT t.account_no, t.contract_id FROM t) t
    USING (SELECT u.account_no_old, u.account_no_new, v.contract_id
           FROM u, v
           WHERE v.tenant_id = u.tenant_id) s
    ON((t.account_no,t.contract_id,'x')=((s.account_no_old,s.contract_id,'x')) OR 1=2) 
    WHEN MATCHED THEN UPDATE SET t.account_no = s.account_no_new;
    

    db <> fiddle demo3



    1. MATLAB7.0とMYSQLの接続

    2. C#から出力パラメータとして参照カーソルを使用してOracle関数を呼び出す方法は?

    3. AndroidがMySQLデータベースに正しく接続できない

    4. 会計アプリケーションの金額にfloatまたはdecimalを使用しますか?