Oracle sql 2つのテーブルに同じ値があった場合のアップデートについて 

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,879

takuyaf

score 8

前提・実現したいこと

sqlのアップデート処理で
TBJIP19CとTBJIP05Gの二つのテーブルに同じ値があった場合
TBJIP19Cの値を書き換える

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

SQL   : ORA-00933: SQLコマンドが正しく終了されていません。

該当のソースコード

Oracle
UPDATE TBJIP19C 
SET
  TBJIP19C.SU_KANPAN = '100'
  , TBJIP19C.KI_RKSYARYO = '200' 
FROM
  TBJIP19C 
  LEFT JOIN TBJIP05G 
    ON TBJIP05G.DD_NENTUKI = TBJIP19C.DD_NENTUKI 
    AND TBJIP05G.CD_SYAIN = TBJIP19C.CD_SYAIN 
    AND TBJIP05G.CD_KAISYA = TBJIP19C.CD_KAISYA

試したこと

leftjoin等やってみましたが同じエラーが出てしまいます

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

sql実行をしているのはA5:sql ver2.10.1
DD_NENTUKIのデータ型はCHR(6)
CD_SYAIN のデータ型はCHR(6)
CD_KAISYA のデータ型はCHR(2)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

OracleではUPDATE文のFROM句は利用できません。

UPDATE文でのFROM句は、
SQL ServerやPostgreSQLなどのベンダ拡張となります。

といってもOracleで同じようなことができないわけでもなく、
確かUPDATE〜SET句の間でサブクエリを記述すると同様なことが出来た記憶があります。

ですが、そもそも更新値に別テーブルの値を設定するのでなければ、
WHERE条件のEXISTS句を用いて実現できるのではないでしょうか?

UPDATE TBJIP19C t1   
SET
    SU_KANPAN = '100'
,    KI_RKSYARYO = '200' 
WHERE
    EXISTS(
        SELECT
            *
        FROM
            TBJIP05G t2
        WHERE
            t1.DD_NENTUKI = t2.DD_NENTUKI 
        AND t1.CD_SYAIN = t2.CD_SYAIN 
        AND t1.CD_KAISYA = t2.CD_KAISYA
    )

追記

UPDATE〜SET内のサブクエリに触れたので、
サブクエリを利用する場合のサンプルも記載します。

下記例はテーブル1とテーブル2のidが一致する、
テーブル1のnameをテーブル2のnameで上書きする処理です。
(テーブルはどちらもid、nameを持つとします)

UPDATE (
    SELECT
        t1.name AS name1
    ,   t2.name AS name2
    FROM
        table1 t1
        INNER JOIN table2 t2
          ON t1.id = t2.id
)
SET
    name1 = name2

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/27 09:39

    詳しい解説と複数の実行方法をお教えくださりありがとうございます。
    WHERE条件のEXISTS句の設定をすることで希望通りの操作を行う事が出来ました。
    まだまだSQLに慣れていないのでいろいろ試していこうと思います。

    キャンセル

  • 2016/09/27 19:14

    > takuyafさん
    問題が解決されたようで何よりです^^

    Orlofskyさんもおっしゃっておりますが、
    DBMSのベンダごとに記載方法が異なるなどがあるため、
    なるべくマニュアルを見るようにすると良いと思います。
    (特に別テーブルを参照するUPDATE文は割とバラついているので・・・^^;)

    キャンセル

0

回答はPanzer_vorさんを見ていただくとして、質問する前にマニュアルくらい確認して欲しいものです。
SQL言語リファレンス UPDATE構文
SQLを実行できるに足るCREATE TABLE, CREATE INDEX も載せるべきです。
ヘボン式ローマ字表 を使わないのも最近では珍しいですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/27 09:35

    アドバイスありがとうございます。
    CREATE TABLE, CREATE INDEXについては考えがそこまで及んでおりませんでした。
    次回からは用意するようにしておきます。
    ヘボン式ローマ字表については現行のDBがこの形だったので、変更せずに行いました。

    キャンセル

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

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