分解して考えるとそこまで難しくはないのですが、いつも書き方を忘れてしまうので備忘録として残します。
他のテーブルと結合させて、そのテーブルの値を使いたい場面などに参考になるかと思います。
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;