インドカレーファンクラブ

パソコン、カメラ

【SQL】関連しない複数テーブルをそれぞれSELECTした結果を使ってinsertしたい

前提

この記事のテーブル構成を丸パクリ!(名前ちょっと違うけど)

qiita.com

  • 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ファイルで中間テーブルにデータ入れる時にはそうもいかないので... という話だったのだ