如何查找表中没有逆序对的对?

时间:2019-02-03 03:31:42

标签: sql sqlite

有两个表。

朋友,在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));

1 个答案:

答案 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的标量MINMAX函数。在这种情况下,我们不一定知道给定的朋友关系或相似关系的顺序。因此,我们可以在任一侧比较两个ID值中的较小值和较大值。