使用SQLite中其他表的值对来过滤元组

时间:2017-05-17 09:07:06

标签: sql sqlite

我有两张桌子,朋友(F)和喜欢(L)。 朋友代表成对的学生(ID1,ID2)。友谊是相互的,所以如果(1510,1381)在朋友表中,那么(1381,1510)。 喜欢代表喜欢学生ID2的学生ID1对。然而,喜欢某人并不一定是互惠的,所以如果(1381,1510)在喜欢表中,则无法保证(1510,1381)也存在。

这是生成两个表的SQL代码:

create table Friend(ID1 int, ID2 int);
create table Likes(ID1 int, ID2 int);

insert into Friend values (1510, 1381);
insert into Friend values (1501, 1247);
insert into Friend values (1468, 1641);
insert into Friend values (1641, 1468);
insert into Friend values (1101, 1641);
insert into Friend values (1247, 1911);
insert into Friend values (1641, 1101);
insert into Friend values (1247, 1501);
insert into Friend values (1911, 1247);
insert into Friend values (1381, 1510);
insert into Friend select ID2, ID1 from Friend;

insert into Likes values(1689, 1709);
insert into Likes values(1911, 1247);
insert into Likes values(1641, 1468);
insert into Likes values(1316, 1304);
insert into Likes values(1501, 1934);

我希望表格喜欢中的对(ID1,ID2)未包含在表朋友中。期望的输出将是这个:

ID1     ID2
1689    1709
1316    1304
1501    1934

我刚刚摆脱了对(1911年,1247年)和(1641年,1468年)。

我的快速尝试:

SELECT DISTINCT *
FROM Likes L, Friend F
WHERE L.ID1 <> F.ID1 AND L.ID1 <> F.ID2 AND L.ID2 <> F.ID1 AND L.ID2 <> F.ID2

哪个查询会给我所需的输出?任何的想法? THX。

2 个答案:

答案 0 :(得分:1)

我会选择left join,以便保留所有喜欢的行,但如果在null上找不到匹配的行,则会与friends相关联。这样,您可以过滤这些空值以获取所需的行

select  L.*
from    likes L
left join
        friends F
on      L.ID1 = F.ID1 and
        L.ID2 = F.ID2
where   F.ID1 is null

答案 1 :(得分:1)

您希望另一个表中没有对应行的所有行;这转化为correlated subquery

SELECT *
FROM Likes
WHERE NOT EXISTS (SELECT *
                  FROM Friends
                  WHERE Friends.ID1 = Likes.ID1
                    AND Friends.ID2 = Likes.ID2);

但是,如果您没有选择其他列而不是您要比较的列,即,如果您要比较整行,那么最简单的方法是使用compound query

SELECT ID1, ID2 FROM Likes
EXCEPT
SELECT ID1, ID2 FROM Friends;