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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

1回答

346閲覧

複数テーブルを使用したupdate

kamome38

総合スコア1

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

0グッド

0クリップ

投稿2022/06/22 05:15

編集2022/06/22 06:47

目的は3テーブルを使って条件にあったカラムを更新
詳細としては
①AテーブルとBテーブルを結合して条件にあった値を出す
②その出した項目とCテーブルにある値を比較して一致しているものは更新
③更新はAテーブルとBテーブルを結合した値をひかくしてAテーブルのあたいをCテーブルのあたいに更新します。
"SET Aテーブル.BUPIIN = Cテーブル.BUPIIN"
になります。
Aテーブル、
ID
NO
NOU
BUPIIN

Bテーブル
ID
NO
NOU

Cテーブル
NO
GO
BUPIIN

select文のみ作りあげたのですがupdate文を作るとなるとどこにどうはめてというのがわからなくなりどなたか知恵をお貸しください。
以下

UPDATE (select *from Aテーブル inner join Bテーブル on Aテーブル.ID = Bテーブル.ID and Aテーブル.NO = Bテーブル.NO and Aテーブル.NOU = Bテーブル.NOU) SET Aテーブル.BUPIIN = (select Cテーブル.BUPIIN from Cテーブル where Aテーブル.NO = Cテーブル.NO)

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

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

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

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

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

KOZ6.0

2022/06/22 06:39

「CテーブルのあたいをAテーブルのあたいに更新します。」なので "SET Aテーブル.BUPIIN = Cテーブル.BUPIIN" 逆ではないですか?
kamome38

2022/06/22 06:47

記載間違いです。すみません。 正しくは Aテーブルの値をCテーブルの値で更新するというものです。
KOZ6.0

2022/06/22 07:37 編集

2点直せば動きそうです。 (1) 更新対象クエリには、Aテーブルの項目のみあればいいので (SELECT Aテーブル.* FROM ~ とします。 (2) SET で更新できるのはクエリ結果なので Aテーブルではありません SET BUPPIN = ~ とします。
guest

回答1

0

ベストアンサー

これでいけませんか?

SQL

1UPDATE 2(select Aテーブル.* from Aテーブル 3inner join Bテーブル 4on Aテーブル.ID = Bテーブル.ID 5and Aテーブル.NO = Bテーブル.NO 6and Aテーブル.NOU = Bテーブル.NOU) TARGET 7SET TARGET.BUPIIN = (select Cテーブル.BUPIIN from Cテーブル where TARGET.NO = Cテーブル.NO)

下のように書いても同じです。

SQL

1UPDATE Aテーブル SET 2SET Aテーブル.BUPIIN = (select Cテーブル.BUPIIN from Cテーブル where Aテーブル.NO = Cテーブル.NO) 3WHERE 4(ID, NO, NOU) IN (SELECT ID, NO, NOU FROM Bテーブル)

投稿2022/06/22 07:50

編集2022/06/22 08:25
KOZ6.0

総合スコア2626

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

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

kamome38

2022/06/22 08:13

回答ありがとうございます。🙇‍♂️ 1つ目のSqlを実行したところ、 select Cテーブル.BUPIIN from Cテーブル where TARGET.NO = Cテーブル.NO) 箇所にて TARGET.NO 無効な識別子と表示されしょりはおこなわれませんでした。 2つ目のsqlでは 単一行副問い合わせにより2つ以上行が戻りますとでてますので結果が複数出てることは理解できるのですがどこで出ているのかがさっぱりでした。
KOZ6.0

2022/06/22 08:21

1つめは、更新対象クエリにエイリアスの TARGET を記述し忘れていませんか? 2つめは、Cテーブルのレコードが特定できないエラーかと思いますが、Cテーブルの NO は PRIMARY KEY ではないのでしょうか?
KOZ6.0

2022/06/22 08:25

あ。1つめ Aテーブル.* にするのを忘れていました。
KOZ6.0

2022/06/22 08:33

NO が Aテーブルにあって、Cテーブルに無い場合は NULL になってしまうので、 更新しないのだとしたら、UPDATE の WHERE に AND NO IN (SELECT NO FROM Cテーブル) の条件追加が必要です。
kamome38

2022/06/22 08:38

お忙しい中、お時間を頂き申し訳ありません。 1つめは、更新対象クエリにエイリアスの TARGET を記述し忘れていませんか? → エイリアス名をつけ実行しましたので問題は無いかと思います。 Aテーブル.*で実行は"キー保存されていない表にマップする列は変更出来ません"と表示されたのでAテーブルを付けるとおかしくなったので出来そうにありません。🙇‍♂️ 2つめは、Cテーブルのレコードが特定できないエラーかと思いますが、Cテーブルの NO は PRIMARY KEY ではないのでしょうか? →PKでした<(_ _)> 最近組み始めたので何が原因とかがわからないのですがプライマリキーだとなにが原因でエラーとなるのでしょうか。 質問ばかりすみません。
KOZ6.0

2022/06/22 08:57 編集

(1) キー保存されていない表にマップする列は変更出来ません Bテーブルと結合することで、Aテーブルの行が特定できない場合にエラーが発生します。 AテーブルとBテーブルが 1:N になっていませんか? (2) 単一行副問い合わせにより2つ以上行が戻ります Cテーブルの NO が PRIMARY KEY なら、そのエラーは起きないはずです。 ひょっとして NO + GO で PRIMARY KEY ですか?
kamome38

2022/06/22 09:12

CテーブルのNO PRIMARY KEYではありませんでした。申し訳ありません。 のでエラーは起きるということになります。
KOZ6.0

2022/06/22 09:17

Aテーブルの NO に対して Cテーブルが複数ある場合、どのように更新するのでしょうか?
kamome38

2022/06/23 04:34

ご教授頂いた内容で修正して無事に更新されることを確認出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問