查找没有反向关系的关系记录

时间:2013-11-18 17:20:08

标签: sql ruby-on-rails arel

在我的Rails应用程序中,我有一个relationships表,其中包含2列origin_idtarget_id。我需要构建一个范围without_reverse_relationship,它返回所有没有反向关系的关系。

例如,如果我有以下relationships条记录:

origin_id target_id 
     1          2
     2          1
     1          3

我希望Relationship.without_reverse_relationship仅返回最后一条记录(origin_id = 1,target_id = 3),因为表中不存在反向记录(origin_id = 3,target_id = 1)。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT r1.*
FROM relationships r1
  LEFT JOIN relationships r2
    ON r2.origin_id = r1.target_id
      AND r2.target_id = r1.origin_id
WHERE r2.origin_id IS NULL 

答案 1 :(得分:0)

这种逻辑应该有用。语法将取决于您未指定的rdbms。

 select *
 from relationships
 where concat(to_string(originId), to_string(target_id)) in
 (select concat(to_string(originId), to_string(target_id))
 from relationships
 except 
 select concat(to_string(target_id), _string(originId))
 from relationships)