質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

SQLで結合した結果のテーブルを更新したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 776

kamiyu

score 6

前提・実現したいこと

タイトルの通り、SQLで結合した結果のテーブルを更新したいです。
環境はoracle11g、使用しているエディタはA5エディタです。

発生している問題・エラーメッセージ

ORA-01779: キー保存されていない表にマップする列は変更できません

該当のソースコード

実際はもっと複雑なのですが、関連性がある部分だけ記載します。
テーブルA
A1:テーブルAの主キー
A2:制約の無いデータ

テーブルB
B1:テーブルBの主キー
A1:テーブルAの主キーを保有している。外部制約などは無い。
A2:新しく追加したカラム。現在全部null

・テーブルAが親、テーブルBが子供の関係
・テーブルAの1行に対して、テーブルBは複数行存在する
・テーブルBは親であるテーブルAの主キーをレコード上保有しているが、DB上は不整合な値も登録は可能

上記の状態でテーブルBに新しく追加したA2カラムにテーブルAのA2の値をSQLで登録したいです。
A1の値が同じレコードには同じA2が登録されて欲しい)

試したこと

update (
select テーブルB.A2 as A2_new、テーブルA.A2 as A2_old 
from テーブルB left outer join テーブルA on テーブルB.A1 = テーブルA.A1 
)
set A2_new = A2_old 

上記SQLでupdateしようとするとORA-01779が発生しました。
調べてみたら更新するレコードが一意にならない場合に発生するエラーのようですが、子データから親データを見ると一意になるのでは?と考えています。

merge構文でも試してみましたがそちらはORA-30926エラーが発生しました。
発行したmergeのSQLは手元に無く、すぐに記載できそうにないです。すみません。
確認できたら、改めて追記します。

あまりにも上手くいかず、全然見当外れの調べ方をしているのではないかと不安になり、こちらで質問させていただきました。調べる視点や、疑うべき箇所などヒントになりそうな部分があれば教えてください。
質問している現在SQLを発行できる環境にいないので、追記が必要そうな場合は後日追記します。

補足情報(FW/ツールのバージョンなど)

特になし

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

テーブルA→(1:n)→テーブルB
という関係でテーブルAの値でテーブルBを更新するなら、ORA-01779は発生しないはずですけどね。

試しに以下のSQLで試してサブクエリーが複数の値を返すエラーになるなら、関係は正しくないという事だと思います。

update テーブルB B set
 A2=(select A2 from テーブルA where A1=B.A1)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/27 23:23

    sazi様、回答ありがとうございます。
    結論からお伝えすると、テーブルの関係に認識違いがありテーブルAは2つのカラムの複合キーでした。
    そのため、レコードを一意に抽出できていなかったようです。
    (データとしてはキー1つで一意になるはずなのに、なぜか定義が複合キーでした)

    よりシンプルなSQLで調査して問題点を見つけることができました。
    こちらの疑問はこれでクローズとさせていただきます。ありがとうございました。

    キャンセル

0

Update句の中でJoinが使えないのでサブクエリ内でJOINを指定します。

http://replication.hatenablog.com/entry/2014/09/16/103000

またWHERE句がないです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/27 23:18

    junzi様、回答ありがとうございます。
    リンクのページはまさに私が参考にしたページの1つでした。

    すべてのデータが更新対象のため、where句はいれていませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる