4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PostgreSQL】using内で複数のテーブルを参照してdeleteする方法

Posted at

はじめに

あるテーブルの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同様サブクエリを使用可能

あまり具体的なコードを書いている例が出てこなかったので、備忘として残しました。
誰かのお役に立てば何よりです。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?