teratail header banner
teratail header banner
質問するログイン新規登録
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

7437閲覧

3つのテーブルデータから一致するデータを一括削除したい

lianprivate

総合スコア23

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/12/26 06:21

0

0

現在3つのテーブルに各々プライマリキーとしてIDを設定しています。
WHERE句で一つのテーブルのIDを指定するとそれぞれのテーブルからIDに一致したデータを削除したいのです。

調べてみた所、PostgreSQLの拡張機能でUSINGがあった為、試してみましたが1つのテーブルからしか削除されませんでした。

PostgreSQL

1DELETE FROM m_user 2USING privacy_tbl,OTHERINFO 3WHERE m_user.uid = privacy_tbl.userid 4AND privacy_tbl.userid = otherinfo.infoid 5AND m_user.uid = 7

USINGが上手く使えていないのでしょうか?
ご指導頂ければありがたいです。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kunai

2018/12/26 06:24

1つのSQLで3テーブルに対してDeleteを投げたいということですか?
lianprivate

2018/12/26 06:28

仰る通りです。
guest

回答3

0

deleteでのusingは以下の様なものです。やろうとしている事には即しません。

DELETE FROM [ ONLY ] table [ [ 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に対象のテーブルを繰り返さないでください。

方法は2つ考えられます。
CASCADE

外部キー制約として、参照側にON DELETE CASCADEが設定されている場合は、被参照側が削除された場合に合わせて削除されます。

CREATE TEMPORARY TABLE COMMIT ON DROP

発行するSQLは複数となりますが、一連のトランザクションで、一時テーブルに削除した情報を残せば他のテーブルにも利用できます。

一時テーブルに情報を格納するのには、以下の様にWITHを使用すると複数データの場合にも対応できます。

SQL

1create temporary table delete_log (id as integer) commit on drop; 2with delete_rows as ( 3 delete from m_user where uid = 7 4 returning * 5) 6insert into delete_log 7select uid from moved_rows;

ただ複数のデータを一括で処理するような場合に利用するものですから、指定するキーが分かっているような今回の場合には敢えて行う必要が無いものです。

投稿2018/12/26 07:40

sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lianprivate

2018/12/26 08:05

ちょっとすぐにはできたかどうかの返答ができませんが、それぞれの役割など調べてもう一度挑戦してみます!ありがとうございます!
guest

0

ベストアンサー

質問には参照したURLも提示した方が適切なコメントが付き易いです。

PostgreSQL DELETE

PostgreSQLでは、USING句で他のテーブルを指定することで、WHERE条件内で他のテーブルを参照することができます。 例えば、指定したプロデューサが製作した全ての映画を削除する時は、次のようなコマンドを実行します。

SQL

1DELETE FROM films USING producers 2 WHERE producer_id = producers.id AND producers.name = 'foo';

マニュアルがわかりにくいですが、テーブルのDELETEは個々のテーブルに対してDELETEを実行しなければなりません。

SQL

1DELETE TABLE1 WHERE 条件 ; 2DELETE TABLE2 WHERE 条件 ;

投稿2018/12/26 06:49

Orlofsky

総合スコア16419

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lianprivate

2018/12/26 07:12

まさしく私が参考にしたページです。 なるほど、よく読んで見ると確かにあくまで参照するだけで一括での処理はできないのですね・・・。 ありがとうございました!
guest

0

SQL

1delete m_user, privacy_tbl, otherinfo 2 from m_user 3 left join privacy_tbl on m_user.uid = privacy_tbl.userid 4 left join otherinfo on privacy_tbl.userid = otherinfo.infoid 5 where m_user.uid = 7;

とかどうでしょう。
テーブル作るの面倒なので試していませんが。

投稿2018/12/26 06:47

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lianprivate

2018/12/26 07:13

回答ありがとうございました! 試してみましたがエラーで動きませんでした。修正してみましたがやはりOrlofskyさんの仰るとおり一括削除はできないと諦めて、1つずつ処理するコードを書いてみます!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問