joinを使って複数カラムをUPDATE, DELETE, INSERTしたいとき [MySQL]

Pocket

分解して考えるとそこまで難しくはないのですが、いつも書き方を忘れてしまうので備忘録として残します。

他のテーブルと結合させて、そのテーブルの値を使いたい場面などに参考になるかと思います。

UPDATE

update table_a as a,
(
    select a.id, c.id as group_id, c.name
    from table_a as a
    join table_b b on b.user_id = a.id
    join table_c c on c.id = b.group_id
    group by c.id
    having c.id in
    (
        select a.id from table_a a
        join table_d d on d.id = a.staff_id
        where a.id is null
    )
) A
set a.group_id = A.group_id , a.group_name = A.name
where a.id = A.id;

DELETE

tmp使わないと、You can’t specify target table ‘XXX’ for update in FROM clause と怒られます。

delete from table_a
where (column_a, column_b) in
(
 select column_a, column_b from
 (
  select a.column_a, a.column_b from table_b b
  left outer join table_a a on a.id = b.id
  where a.column_c is null
  group by a.id
 )tmp
);

INSERT

selectで取得するカラム順序はINSERTしたいテーブルのカラム順序に合わせましょう

INSERT INTO table_a
select a.column_a, a.column_b, now(), now() from table_a a
left outer join table_b b on b.id = a.id
where b.column_c is null
group by a.id;