裏紙に書く程度の内容

複数テーブルからDELETE

複数のテーブルからデータを削除するSQL文についてです。

結論から言うとこんな感じ。

delete table1, table2
from table1
left join table2 on table1.id = table2.id
where table1.column = ?

使用例

下記のような2テーブルがある場合を想定します。

table : user

user_id name age
1 さいとう 10
2 すずき 20
3 ささき 20
4 ジョン 30
5 いとう 10

table : opt

option_id user_id optional_data
1 1 xxx
2 1 yyy
3 2 ○○○
4 2 ×××
5 3 △△△
6 4 □□□

要件として、user テーブルの、age が 20のユーザを消します。opt テーブルの紐づくデータも削除します。

素直に考える

素直に考えれば以下のように消すことになると思います。

①対象となる user_id を取得

select user_id from user where age = 20

user_id : 2, 3 が取得できます。

②optデータ削除

delete from opt where user_id in (2, 3)

opt テーブルから対象データを削除します。

③userデータ削除

delete from user where age = 20

user テーブルから対象データを削除して完了です。

また、ちょっと考えると上記①、②は1個のSQLにまとめられます。

delete from opt
where user_id in (
  select user_id from user where age = 20
)

SQL1個で何とかする

JOINを使えば1個のSQLで user, opt 両方削除できます。

delete user, opt
from user
left join opt on user.user_id = opt.user_id
where age = 20

SQL得意な人からしたら常識なんでしょうかね?

JOINを使ったUPDATE文についてはこちら

Index