PostgreSQL 9.3データベースに2つのテーブルがあります。テーブルlink_reply
には、テーブルwhich_group
を指すlink_group
という名前の外部キーがあります。
link_group
に関連する行が存在しないlink_reply
からすべての行を削除したい。基本的には十分に聞こえますが、私はそれに苦労しています。
これはこのような単純なものになりますか(機能しません)?
DELETE FROM link_group WHERE link_reply = NULL;
データベース内の他のテーブルに含まれている情報を使用してテーブル内の行を削除するには、副選択を使用する方法と、
USING
句で追加のテーブルを指定する方法の2つがあります。どの手法がより適切であるかは、特定の状況によって異なります。
大胆な強調鉱山。別のテーブルに含まれているnotである情報を使用するのは少し厄介ですが、簡単な解決策があります。標準的な技術の武器庫から...
... NOT EXISTS
反準結合は、おそらくDELETE
に対して最も単純で最も効率的です。
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
(テーブル定義が提供されていないため)link_group_id
をlink_group
の主キーの列名として想定します。
テクニック @ Mihaiがコメント も機能します(正しく適用されます):
DELETE FROM link_group lg
USING link_group lg1
LEFT JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE lg1.link_group_id = lg.link_group_id
AND lr.which_group IS NULL;
ただし、USING
句のテーブル式はCROSS JOIN
を使用してターゲットテーブル(例ではlg
)に結合されているため、飛び石と同じテーブルの別のインスタンスが必要です。 (例ではlg1
)LEFT JOIN
の場合、エレガントさが低下し、通常は遅くなります。