我有这个问题要解决:如果两个学生A和B是朋友,而A喜欢B但反之亦然,请删除喜欢条目。
对于后台,Friend表有两列,STU1和STU2。如果他们是朋友,那么将会有一个显示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)
答案 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))
答案 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)