有两个表。
朋友,在ID1,ID2处描述ID1和ID2是朋友(如果ID1是ID2的朋友,则ID2是ID1的朋友);
喜欢,属性ID1,ID2描述了ID1喜欢ID2(ID1喜欢ID2不一定意味着ID2喜欢ID1)。
在这样的情况下,我被要求删除“喜欢”元组,即两个学生A和B是朋友,而A喜欢B,但反之亦然。以下是我的查询,但没有删除任何元组:
delete from Likes where exists (
select ID1,ID2 from Friend
where exists (select ID1,ID2 from Likes)
and not exists (select ID2,ID1 from Likes));
答案 0 :(得分:0)
您处在正确的轨道上。下面的方法是使用肯定的EXISTS
子句来检查给定的相似对是否也具有朋友关系。然后,它使用否定的NOT EXISTS
子句还断言该元组的Likes
表中不存在类似倒数的关系。
DELETE
FROM Likes l1
WHERE
EXISTS (SELECT 1 FROM Friend f WHERE MIN(f.ID1, f.ID2) = MIN(l1.ID1, l1.ID2) AND
MAX(f.ID1, f.ID2) = MAX(l1.ID1, l1.ID2)) AND
NOT EXISTS (SELECT 1 FROM Likes l2 WHERE l1.ID1 = l2.ID2 AND l1.ID2 = l2.ID1);
请注意,在第一个EXISTS
子句中,我使用了SQLite的标量MIN
和MAX
函数。在这种情况下,我们不一定知道给定的朋友关系或相似关系的顺序。因此,我们可以在任一侧比较两个ID
值中的较小值和较大值。