我有两张桌子,朋友(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。
答案 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;