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

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

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

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

Q&A

解決済

2回答

869閲覧

一方のテーブルにしか存在しないデータをもう一方のテーブルにinsetしたい

mulberry

総合スコア7

MySQL

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

0グッド

0クリップ

投稿2021/11/09 05:58

編集2021/11/09 06:16

前提・実現したいこと

・下記のようなproductsテーブルとmailテーブルが存在している
・mail_typeは1と3で固定であり、セットでinsertする。

productsテーブルに存在しておりmailテーブルに存在しないproduct_idがある場合に、mailテーブルに、該当するproduct_idと、mail_typeをinsertしたいのですが、SQLの知識が浅く詰まっております。
ご助言いただければ幸いです。よろしくお願いいたします。
######products

product_idname
1test1
2test2
5test5

######mail

product_idmail_type
11
13
31
33
51
53

######期待値(mail)

product_idmail_type
11
13
21
23
31
33
41
43
51
53

発生している問題・エラーメッセージ

SQLの作成に詰まっている。

試したこと

OUTER JOINをおこない、idが存在し、かつproduct_idが存在しない場合に
INSERT INTO TABLE (product_id, mail_type) VALUES (id, '1'),(id, '3');
という感じにしたいのですが、知識が足りず、実現に時間を要しております。

 ```
SELECT
m.*,
p.product_id as id
FROM
dtb_mail m
RIGHT OUTER JOIN dtb_products p ON m.product_id = p.product_id
ORDER BY p.product_id ASC;

|product_id|mail_type|id| |:--:|:--:|:--: |1|1|1 |1|3|1 |||2 |3|1|3 |3|3|3 |||4 |5|1|5 |5|3|5 ### 補足情報(FW/ツールのバージョンなど) mysql バージョン:5.6.37

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

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

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

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

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

guest

回答2

0

ベストアンサー

たとえば以下のようなSQLで実現できるかと思います。

SQL

1INSERT INTO mail (product_id, mail_type) 2SELECT P.product_id, T.* 3FROM products P 4CROSS JOIN (SELECT 1 UNION ALL SELECT 3) T 5WHERE NOT EXISTS ( 6 SELECT * 7 FROM mail M 8 WHERE P.product_id = M.product_id 9);

投稿2021/11/09 06:30

neko_the_shadow

総合スコア2349

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

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

mulberry

2021/11/09 07:04

実現できそうです!ありがとうございます。 cross joinn はあまり使用してこなかったので勉強いたします。
guest

0

product_idに対してmail_typeの1,3が固定なら正規化するのが普通です

sample

SQL

1create table products(product_id int unique,name varchar(10)); 2insert into products values 3(1,'test1'),(2,'test2'),(4,'test4'); 4 5create table mail_products(product_id int unique); 6insert into mail_products values(1),(3),(5); 7 8create table types(mail_type int unique); 9insert into types values(1),(3); 10 11select * from mail_products,types;

ここでmail_productsに対してproductsのデータを流し込んで再表示

SQL

1insert ignore into mail_products select product_id from products; 2 3select * from mail_products,types;

投稿2021/11/09 06:05

編集2021/11/09 06:18
yambejp

総合スコア116724

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

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

mulberry

2021/11/09 07:06

すぐに回答いただきありがとうございます。 今回前提としてデータ構造の変更ができないことの記載を失念しておりました。 正規化についてなど勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問