PostgreSQLでJOINした結果をDELETEする
このようなテーブルがあったとする。
猫の名前を扱うcatテーブル
cat_id | cat_name | owner_id |
---|---|---|
1 | Tama | 3 |
2 | Kuro | 1 |
3 | Momo | 2 |
猫の飼い主を扱うownerテーブル
owner_id | owner_name |
---|---|
1 | Tom |
2 | Bob |
3 | Jack |
JOINして、Tomさんの飼っている猫の情報だけSELECTする
SELECT a.cat_id, a.cat_name, a.owner_id, b.owner_name
FROM cat a
LEFT JOIN owner b
ON a.owner_id = b.owner_id
WHERE b.owner_name = 'Tom';
結果
cat_id | cat_name | owner_id | owner_name |
---|---|---|---|
2 | Kuro | 1 | Tom |
Tomさんの飼っている猫の情報だけDELETEする
方法1 USING句を使う
DELETE
FROM cat a USING owner b
WHERE a.owner_id = b.owner_id AND b.owner_name = 'Tom';
方法2 IN句を使う
DELETE
FROM cat
WHERE owner_id IN (SELECT owner_id FROM owner WHERE name = 'Tom');
PostgreSQLでは、USING句で他のテーブルを指定することで、WHERE条件内で他のテーブルを参照することができます。
副問い合わせ形式より結合形式の方が書き易い、あるいは、実行が速くなることがあります。
PostgreSQL 10.5文書
…とのことなので、詳しくは日本語マニュアルのDELETEに関するページを参照してください。