SQL子查询没有返回我所期望的

时间:2013-01-29 22:37:58

标签: sql sqlite

我有这个问题要解决:如果两个学生A和B是朋友,而A喜欢B但反之亦然,请删除喜欢条目

对于后台,Friend表有两列,STU1和ST​​U2。如果他们是朋友,那么将会有一个显示STU1,STU2和STU2,STU1的条目。

在Likes表中,如果学生A喜欢学生B,则会有STU1,STU2的条目,但如果学生B不喜欢学生A,则不会有STU2,STU1的条目。

所以,这就是我尝试过的。问题是它仍然在Likes表中留下两行应该在那里。关于如何解决这个问题的任何想法?

delete from Likes
where exists 
    (select F.STU1, F.STU2 from Friend F
        where exists  
        (select L.STU1, L.STU2 from Likes L, Friend F where
            F.STU1 = L.STU1 and F.STU2 = L.STU2)
        )
    and not exists
        (select L.STU1, L.STU2 from Likes L, Friend F where
            F.STU1 = L.STU2 and F.STU2 = L.STU1)

2 个答案:

答案 0 :(得分:0)

编辑:

with onewayfriends as (
select f.* from friend f
left outer join likes l1 on l1.stu1=f.stu1 and l1.stu2=f.stu2
left outer join likes l2 on l2.stu1=f.stu2 and l2.stu2=f.stu1
where l1.stu1 is null or l2.stu1 is null)

delete l from likes l, onewayfriends f
where l.stu1 in (f.stu1, f.stu2) and l.stu2 in (f.stu1, f.stu2)

编辑2,因为它的sqllite将cte重写为嵌套查询,并将join作为'where id in in ..'

重写
delete from likes where rowid in (select l.rowid from
(
  select f.* from friend f
  left outer join likes l1 on l1.stu1=f.stu1 and l1.stu2=f.stu2
  left outer join likes l2 on l2.stu1=f.stu2 and l2.stu2=f.stu1
  where l1.stu1 is null or l2.stu1 is null
) f, likes l
where l.stu1 in (f.stu1, f.stu2) and l.stu2 in (f.stu1, f.stu2))

fiddle

答案 1 :(得分:0)

你说Friend表有两对。因此,我们需要从Likes表中删除该对,其中该对位于Friend表中,但Likes表中不存在反对。

DELETE
FROM Likes
WHERE EXISTS (SELECT 1 FROM Friend f WHERE Likes.STU1 = f.STU1 AND Likes.STU2 = f.STU2)
  AND NOT EXISTS (SELECT 1 FROM Likes ml WHERE Likes.STU1 = ml.STU2 AND Likes.STU2 = ml.STU1)