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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

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回答

11593閲覧

Oracle update 複数テーブルを結合して更新したい

khnggtu

総合スコア7

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

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クリップ

投稿2020/08/26 13:56

前提・実現したいこと

Oracle11gで下記の条件を満たすUPDATE文を作りたいと思っています。
Teble_Bの「TYPE」カラムの3の中にある「ALPHA」カラムの文字列を条件として,
Teble_Aの「NAME」カラムの文字列に,Teble_Bの「ALPHA」カラムの文字列を()を入れて結合(例:太郎(Class leader))したいが,
Teble_AとTeble_Bで一致しているカラムの値(=がない)が存在しないため,Teble_AとTeble_Cの「MEMBER_ID」カラムの値と,Teble_BとTeble_Cの「GROUP_ID」カラムの値を=条件として繋げ,最後にTeble_Bの「TYPE」カラムの3を条件として,UPDATEしたい。

テーブル名:Teble_A

NAMEMEMBER_ID
太郎10
次郎20
五郎30

テーブル名:Teble_B

ALPHAGROUP_IDTYPE
Class leader10003
Chief director20003
Vice president30001
President30003

テーブル名:Teble_C

MEMBER_IDGROUP_ID
101000
202000
303000

実現結果

テーブル名:Teble_A

NAMEMEMBER_ID
太郎(Class leader)10
次郎(Chief director)20
五郎(President)30

試したこと

下記のSQLで実行しましたが,以下のエラーが表示されてしまいます。

行3でエラーが発生しました。: ORA-01427: 単一行副問合せにより2つ以上の行が戻されます

set()の後に,WHEREで直接「MEMBER_ID」カラムの番号を指定すれば1レコード分は更新可能でしたが,一気に条件指定したレコードを更新したい場合は,上記エラーが表示されてしまいます。
色々調べてみたのですが,不明だった為質問させていただきました。
どなたかご教授頂ければと思います。

SQL

1UPDATE Teble_A t1 2set NAME = NAME ||'('|| 3( 4 select t2.ALPHA 5 FROM Teble_B t2, 6 Teble_C t3 7 WHERE t1.MEMBER_ID = t3.MEMBER_ID 8 and t2.GROUP_ID = t3.GROUP_ID 9 and t3.TYPE = 3 10)||')';

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

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

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

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

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

Orlofsky

2020/08/26 15:19

SQLで使われるテーブルはCREATE TABLEを実行しなければなりません。テーブルのデータもINSERTされていなければなりません。質問のテーブル定義は CREATE TABLE文に、テーブルのデータは INSER文で https://teratail.com/help/question-tips#questionTips3-7 の [コード] に変更できた方が適切なコメントが付き易いです。
guest

回答1

0

ベストアンサー

TYPEの参照先がTeble_Cになってますけど、Teble_Cにもtypeがあってエラーにならないなら参照先の誤りです。

単なるタイポで**Teble_B **を参照しているなら、データが複数件返却される状況なのでしょうから、条件の見直しが必要です。

尚、以下のように記述すると、編集記述の可読性が上がります。

SQL

1update ( 2 select t1.name, t2.ALPHA 3 from Teble_A t1 4 inner join Teble_C t3 5 on t1.MEMBER_ID = t3.MEMBER_ID 6 inner join Teble_B t2 7 on t3.GROUP_ID = t2.GROUP_ID 8 and t2.type = 3 9) 10set 11 name = name || '(' || ALPHA || ')'

投稿2020/08/26 16:33

編集2020/08/29 14:01
sazi

総合スコア25327

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

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

khnggtu

2020/08/29 13:52

TYPEの参照先「t2.type」に関しては,SQLコードの誤りでした申し訳ありません。 Update句の中でsetの前にinner Joinが使用不可であるため 以下のSQLコードでサブクエリ内でinner Joinを指定しましたが,エラーが出力されてしまいます。 色々調べてみたのですが,不明です。 不勉強で申し訳ありません,再度ご教授いただけると幸いです。 エラー内容: 「行12でエラーが発生しました。: ORA-00904: "T2.ALPHA": 無効な識別子です。」 SQL: update ( select t2.ALPHA from Teble_A t1 inner join Teble_C t3 on t1.MEMBER_ID = t3.MEMBER_ID inner join Teble_B t2 on t3.GROUP_ID = t2.GROUP_ID and t2.type = 3 ) set t1.name = t1.name || '(' || t2.ALPHA || ')'
sazi

2020/08/29 14:07 編集

回答修正しましたけど、1:1になるように見直さないと駄目かもですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問