PostgreSQL删除记录

时间:2014-02-03 14:09:59

标签: sql postgresql

我有一个表格,其中两个实体之间的关系存储在两个方向上。因此,如果 A 链接到 B ,我有两条记录 - 一条代表A > B,另一条代表B > A

test=# select * from myt;
 id | from_id | to_id 
----+---------+-------
  1 |       1 |     2
  2 |       2 |     1
  3 |       1 |     3
  4 |       3 |     1
(4 rows)

是否可以删除SQL的记录,以便我只记录代表每个关系?

哪一个被删除无关紧要。

2 个答案:

答案 0 :(得分:1)

您可以使用using子句执行某种自联接:

DELETE FROM myt a
USING       myt b
WHERE       a.from_id = b.to_id AND a.to_id = b.from_id  -- The "join"
            AND a.from_id < b.from_id -- Make sure you don't delete both copies

答案 1 :(得分:0)

如果您总是创建一对或多个记录,那么总会有一个带有from_id&gt; to_id,另一个使用to_id&gt; from_id。

因此你可以:

delete from myt
where  to_id > from_id;

如果你真的想保证另一行存在,那么你可以:

delete from myt myt1
where  to_id > from_id and
       exists (select 1
              from   myt myt2
              where  myt2.from_id = myt.to_id and
                     myt2.to_id   = myt.from_id);

如果保证创建该对,则不应该这样做。

如果您可以拥有相同ID的链接,那么您需要以不同的方式区分它们。