はじめに
あるテーブルのdelete文を書いている時に、「あれ、usingの中って複数テーブル書けるんだっけ?」となったので調べて簡単に実験してみました。
【復習】PostgreSQLでテーブルを参照してdeleteをする方法
PostgreSQLで他のテーブルを参照してdeleteを行うには、以下のように2つの方法がありました。
IN区を使う方法
DELETE
FROM
TABLE_A A
WHERE A.NAME in (SELECT B.NAME FROM TABLE_B B)
USING句を使う方法
DELETE
FROM
TABLE_A A
USING
TABLE_B B
WHERE A.NAME = B.NAME
【本題】PostgreSQLでusingで複数テーブルを参照してdeleteをする方法
PostgreSQL公式から引用すると、下のように書いてあります。
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING using_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
(中略)
using_list
WHERE条件内に他のテーブルの列を記述できるようにするための、テーブル式のリストです。 これは、SELECT文のFROM句において指定できるテーブルのリストと似ています。 例えば、テーブル名の別名も指定することができます。 自己結合を設定する目的以外ではusing_listに対象のテーブルを繰り返さないでください。
using_list
は名前からしても、説明をみても複数のテーブルを書けるようです。
よって例えば次のように書けます。
DELETE
FROM
TABLE_A A
USING
TABLE_B B,
TABLE_D D
WHERE A.NAME = B.NAME AND A.ID = D.ID
using_list
にはサブクエリが入ってもいいのかな?と疑問に思ったので、次のような文も試しましたが大丈夫なようでした。
DELETE
FROM
TABLE_A A
USING
TABLE_B B,
(
SELECT
ID
FROM
TABLE_D D
WHERE D.FOO = 'FOO'
) AS E
WHERE A.NAME = B.NAME AND A.ID = E.ID
まとめ
- USING句で指定するテーブルはカンマ区切りで複数指定可能
- 複数書く場合でも、通常のUSING同様サブクエリを使用可能
あまり具体的なコードを書いている例が出てこなかったので、備忘として残しました。
誰かのお役に立てば何よりです。