【SQL】関連しない複数テーブルをそれぞれSELECTした結果を使ってinsertしたい
前提
この記事のテーブル構成を丸パクリ!(名前ちょっと違うけど)
- coursesテーブル
- id
- language
- usersテーブル
- id
- name
- courses_user_relationsテーブル
- id
- user_id
- course_id
こういう感じのテーブル構成で
courses_user_relationsテーブルに
insert into courses_user_relationsテーブル(user_id, course_id) values (1, 1);
じゃなくて
insert into hoge(text, user_id) values ( select id from user where name = 'john' limit 1, select id from courses where language = 'HTML' limit 1 );
みたいなことしたい
で、PostgreSQLを使うことにする
結論
cross joinを使う
WITH U AS (SELECT id AS user_id FROM users WHERE name = 'john' LIMIT 1), B AS (SELECT id AS course_id FROM courses WHERE language = 'HTML' limit 1) INSERT INTO courses_user_relations(user_id, course_id) SELECT user_id, book_id FROM U, B ;
SELECT user_id, book_id FROM U, B
部分は
SELECT user_id, book_id FROM U CROSS JOIN B
でもOK
FROM T1 CROSS JOIN T2はFROM T1, T2と同じです。 また(後述の)FROM T1 INNER JOIN T2 ON TRUEとも同じです。
https://www.postgresql.jp/document/9.2/html/queries-table-expressions.html
よもやま
普通にバックエンド処理の中でこれやるならusersやらcoursesを縛る値はロジックの中で取り回してるでしょ?と想像すると思う、
今回なんでこれがしたかったかというと、Migrationファイルで中間テーブルにデータ入れる時にはそうもいかないので... という話だったのだ