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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

3回答

1445閲覧

【初心者】update文で、別テーブルを参照し、指定のレコードを更新する方法【サブクエリ】

MireiLee

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/10/10 06:51

編集2022/01/12 10:55

いつもteratailでいろいろ助けられています。
プログラミング初心者です。今回はmysqlの書き方について質問させてください。

条件:

A,B2つのテーブルがあります。
(カラムの属性は省略して書きました。)

Aテーブル
a_id(主キー) , a_name , b_id , a_flg

Bテーブル
b_id(主キー) , a_id

このテーブルのjoin 関係は A.a_id = B.a_id です。

B.a_idには任意のA.a_idがあります。

Aのすべてのレコードのa_flgの値は0です。

やりたいこと:

Aテーブルの、Bにa_idが乗ってあるレコードのa_flgを1にupdateしたいです。

日本語を入れてsqlを書くとしたら

sql

1update A 2  left join B 3   on A.a_id = B.a_id 4set A.a_flg = 1 5where 「BにあるAレコード」

こんな感じなのですが、このwhere句にどうかけばいいかわからなかったので教えてほしいです。

もしupdate文 1こじゃなくて いくつかに分けるのだったら簡単ですが

sql

1select A.a_id from A left join B on A.a_id = B.a_id; 2update A set a_flg = 1 where a_id = XXX;#上のselectで取得したa_idをひたすら書き換えて実行

これを一つで実行できるupdate文を教えていただけますでしょうか。

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

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

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

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

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

yambejp

2019/10/10 07:00 編集

> カラムの属性は省略して書きました それが間違いの元。create tableからちゃんとサンプルを提示ください 「set A.a_id = 1」としてますが、a_idはAのプライマリとかじゃなくて 複数存在できるカラムなのでしょうか?
MireiLee

2019/10/10 07:08

あ、失礼しました。 「set A.a_id = 1」 ☓ 「set A.a_flg = 1」 ○ です。a_id はプライマリです! この内容で本文修正します!
guest

回答3

0

UPDATEの部分に2つ以上のテーブルを記載する事に、
抵抗があるのであれば、これでも可。

SQL

1UPDATE A 2 SET A.a_flg = 1 3WHERE EXISTS( 4 SELECT 'X' 5 FROM B 6 WHERE B.a_id = A.a_id 7 ) 8;

投稿2019/10/10 17:58

tomari_perform

総合スコア760

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

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

0

SQL

1create table A(a_id int primary key,a_name varchar(10),b_id int,a_flg tinyint); 2insert into A values 3(1,'a1',100,0), 4(2,'a2',100,1), 5(3,'a3',100,0), 6(4,'a4',100,1); 7 8create table B(b_id int primary key,a_id int); 9insert into B values 10(1,1), 11(2,1), 12(3,2), 13(4,2), 14(5,5);

状況

a_id=1はA,Bに存在してflg=0
a_id=2はA,Bに存在してflg=1
a_id=3はAのみに存在してflg=0
a_id=4はAのみに存在してflg=1
a_id=5はBのみ存在する(Aに存在しなのでflgはなし)

不明

Aテーブルのb_idは何に使うのかわからない

命題

Bテーブルにa_idが存在する場合だけa_flgを1にする?

実行

SQL

1update A,B set A.a_flg=1 2where A.a_id=B.a_id

結果

a_ida_nameb_ida_flg
1a11001
2a21001
3a31000
4a41001

投稿2019/10/10 07:23

編集2019/10/10 07:27
yambejp

総合スコア114572

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

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

MireiLee

2019/10/10 07:55

ご丁寧な回答ありがとうございます! この方法で実行したら求める結果得られました。 本当にありがとうございます。 他の人の返信欄に書きましたが、質問するために似た感じのテーブルを急いで作ってたので、いろいろ漏れがありました。。A.b_idとかいらなかったです。失礼しました>< 改めて、質問するためのテーブルcreate文やinsert文がないまま質問するべきでないと反省しました..!
guest

0

こんな感じでしょうか??

SQL

1UPDATE 2 A 3 SET a_flg = 1 4WHERE 5 a_id IN(select A.a_id from A left join B on A.a_id = B.a_id)

投稿2019/10/10 06:55

mayoi_maimai

総合スコア1583

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

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

MireiLee

2019/10/10 07:51

ご回答ありがとうございます。 この方法で実行してみたのですが、'you can`t specify target table A for update in From clause'とでて実行できませんでした。 実は実際に作業しているテーブルたちはもっと複雑で、 取り急ぎこちらに質問にために、最小限な条件でテーブル定義をして書きました。もしかしたらその過程でなにか条件が足りなかったかもですね・・ですがこの書き方も覚えて行きます!本当にありがとうございました!
mayoi_maimai

2019/10/10 08:05

失礼しました。。 サブクエリの FROM 句と更新のターゲットの両方に同じテーブルは使用できないことを忘れてました。。 未確認ですが以下だったらどうでしょうか?? UPDATE A , (select A.a_id from A left join B on A.a_id = B.a_id) as B SET a_flg = 1 WHERE A.a_id=B.a_id
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問