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

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

ただいまの
回答率

89.52%

OracleのUpdateにおいて3つテーブル結合結果を複数条件として更新したい

解決済

回答 1

投稿

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

msy47

score 7

前提・実現したいこと

OracleのUpdateにおいて、
3つのテーブルを結合した結果をもとに複数の項目を条件に、1つのテーブルの更新を行いたい。

内容
1.3つのテーブルを結合したSelect結果
2.「1.」の結果のもと、複数の項目条件でテーブルの1つの項目すべてを一括更新したい

質問
「内容2.」を実現できるUpdate文についてご教授をお願いいたします。
Select文の抽出結果から4つの項目条件をもとに
Cテーブルの対象レコードすべてを更新したい

いくつか調べた結果近しい
SQL文(2つまでのテーブルを結合したパターン、Select条件結果が1項目までなど)
を見つけることができましたが、実現したいSQLを作成するに至れませんでした。

該当のソースコード

テーブル(3つ)

Table A
    バッチ番号, バッチ・タイプ
Table B
    バッチ番号, バッチ・タイプ, 伝票番号, 伝票会社 ,転記コード
Table C
    バッチ番号, バッチ・タイプ, 伝票番号, 伝票会社 ,転記コード

補足:
Table BとTable Cそれぞれの転記コードが異なっており、それらを統一したいため。

Select
    DISTINCT C.伝票番号,
    C.伝票タイプ,
    C.伝票会社,
    C.転記コード
From
    A
inner join B on(
            B.バッチ番号 = A.バッチ番号
        and
            B.バッチ・タイプ = A.バッチ・タイプ
        )
inner join C on(
            B.伝票番号 = C.伝票番号
        and
            B.伝票会社 = C.伝票会社
        )
where
    A.バッチ・タイプ = 'A'
and
    A.バッチ状況 = 'B'
and
    B.転記コード = 'C'
and
    C.転記コード = 'D'

試したこと

selectの結果4項目の条件をもとにテーブルCの対象すべてのC.転記コードを更新したい

Update条件:
Select結果の、C.伝票番号, C.伝票タイプ, C.伝票会社, C.転記コード = 'D'に合致した
対象レコードすべてのC.転記コードを'Z'に更新したい。    

Update C
Set C.転記コード = 'Z'
from 
(
select文?(不明)
)
where文?(不明)

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

なし 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

質問の条件についての項目名などが統一されておらず、ずれているかもしれませんが、おそらく以下の様なことかと。

update c set 転記コード='Z'
where 転記コード = 'D'
 and (伝票番号, 伝票会社) in (
        select  伝票番号, 伝票会社 
        From    A inner join B 
                on    B.バッチ番号=A.バッチ番号 and B.バッチ・タイプ=A.バッチ・タイプ
        where   A.バッチ・タイプ='A' and A.バッチ状況='B' and B.転記コード='C'
      )

SQL文(2つまでのテーブルを結合したパターン、Select条件結果が1項目までなど)
を見つけることができましたが、実現したいSQLを作成するに至れませんでした。

例は2つのテーブルですが、更新可能なビューであればテーブル数は関係ありません。
SQL 入門 (DMLの基本形式:UPDATE)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/16 15:02

    sazi様
    迅速でわかりやすい回答ありがとうございます。動作を確認できました。助かりました。
    読みずらい質問から適格かつ丁寧な回答、誠にありがとうございました。

    キャンセル

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

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