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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3753閲覧

Oracle11gでテーブル結合してUPDATE文がしたい

m8085

総合スコア4

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/08/09 01:08

前提・実現したいこと

Oracle11gで下記の条件を満たすUPDATEを作りたい
カラムABCに紐づくカラムD最大値のパラメータがすべて空欄だった場合、
カラムABCが同じ値でパラメータが入っている最新のものからパラメータを持ってきてUPDATEしたい
①下記表にてキーABCDが1113のレコードに対して1111のパラメータ1,2,3の内容を入れたい
②下記表にてキーABCDが1123のレコードに対して1122のパラメータ1,2,3の内容を入れたい

テーブル名:TEST
|カラムA(IDその1)|カラムB(IDその2)|カラムC(IDその3)|カラムD(カウントUP系)|パラメータ1|パラメータ2|パラメータ3|
|:--|:--:|--:|
|1|1|1|1|あああ|いいい|ううう|
|1|1|1|2||||
|1|1|1|3||||
|1|1|2|1||||
|1|1|2|2|えええ|おおお|かかか|
|1|1|2|3||||

試したこと

下記のSQLを作成して試しましたが、うまくいきません。
下記のSQLを編集してできますでしょうか?
また他の方法等ありましたら教えてください。

SQL

1UPDATE /*+ BYPASS_UJVC */ 2( 3 SELECT 4 TEST1.カラムA 5 ,TEST1.カラムB 6 ,TEST1.カラムC 7 ,TEST1.カラムD 8 ,TEST1.パラメータ1 TEST1_パラメータ1 9 ,TEST1.パラメータ2 TEST1_パラメータ2 10 ,TEST1.パラメータ3 TEST1_パラメータ3 11 ,TEST2.パラメータ1 TEST2_パラメータ1 12 ,TEST2.パラメータ2 TEST2_パラメータ2 13 ,TEST2.パラメータ3 TEST2_パラメータ3 14 15 FROM 16 テーブルTEST TEST1 17 INNER JOIN 18 ( 19 SELECT 20 * 21 FROM 22 テーブルTEST 23 WHERE 24 (カラムA,カラムB,カラムC,カラムD) IN ( 25 SELECT 26 カラムA 27 ,カラムB 28 ,カラムC 29 ,MAX(カラムD) 30 FROM 31 テーブルTEST 32 WHERE 33 パラメータ1 IS NOT NULL 34 OR パラメータ2 IS NOT NULL 35 OR パラメータ3 IS NOT NULL 36 GROUP BY 37 カラムA 38 ,カラムB 39 ,カラムC 40 ) 41 ) TEST2 42 ON 43 TEST1.カラムA = TEST2.カラムA 44 AND TEST1.カラムB = TEST2.カラムB 45 AND TEST1.カラムC = TEST2.カラムC 46 47 WHERE TEST1.パラメータ1 IS NULL 48 AND TEST1.パラメータ2 IS NULL 49 AND TEST1.パラメータ3 IS NULL 50 AND (TEST1.カラムA,TEST1.カラムB,TEST1.カラムC,TEST1.カラムD) IN ( 51 SELECT 52 カラムA 53 ,カラムB 54 ,カラムC 55 ,MAX(カラムD) 56 FROM 57 テーブルTEST 58 GROUP BY 59 カラムA 60 ,カラムB 61 ,カラムC 62 ) 63) 64set 65 TEST1_パラメータ1 = TEST2_パラメータ1 66 ,TEST1_パラメータ2 = TEST2_パラメータ2 67 ,TEST1_パラメータ3 = TEST2_パラメータ3

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/08/09 01:18

質問のテーブル定義はCREATE TABLE文に、データはINSERT文に変更しませんか?それとUPDATE後の更新結果も載せた方が適切なコメントが付き易いです。 Oracle11.2でキャラクタセットをSJISからAL32UTF8に変更する作業をしたことがあります。SJISでは2バイトだった全角文字がAL32UTF8では 3 or 4バイトに変わり、テーブル名や列名などが30バイトを超えるエラーが多発したので、テーブル名や列名などに全角文字を使うのは止めた方が良いです。
sazi

2019/08/09 02:11

どのように「うまくいかない」のですか?
guest

回答1

0

ベストアンサー

こんな感じで更新できるはずです。
項目名やテーブル名は置き換えてしまっているので変換してください。

SQL

1UPDATE TABLE3 DST 2SET 3 (P1, P2, P3) = ( 4 SELECT 5 P1, P2, P3 6 FROM 7 TABLE3 SRC 8 WHERE 9 (A, B, C, D) IN ( 10 SELECT 11 A, B, C, MAX(D) 12 FROM 13 TABLE3 14 WHERE 15 P1 IS NOT NULL 16 OR P2 IS NOT NULL 17 OR P3 IS NOT NULL 18 GROUP BY 19 A, B, C 20 ) 21 AND SRC.A = DST.A 22 AND SRC.B = DST.B 23 AND SRC.C = DST.C 24 ) 25WHERE 26 (A, B, C, D) IN ( 27 SELECT 28 A, B, C, MAX(D) 29 FROM 30 TABLE3 31 GROUP BY 32 A, B, C 33 ) 34AND P1 IS NULL 35AND P2 IS NULL 36AND P3 IS NULL

追記:
更新条件の絞り込みが間違っていたので修正しました。

投稿2019/08/09 07:04

編集2019/08/09 07:28
KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m8085

2019/08/09 07:34

KOZ6.0さん ありがとうございます、set内にselect文を入れてWHEREの条件で想定の処理ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問