我有一个表格,其中两个实体之间的关系存储在两个方向上。因此,如果 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
的记录,以便我只记录代表每个关系?
哪一个被删除无关紧要。
答案 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的链接,那么您需要以不同的方式区分它们。