我有这张桌子:
SUBSCRIPTION
NAME SUBSCRIBER
它本质上是一张表,其中列出了彼此订阅的人员。我想编写一个输出元组列表的查询,这样,如果集合B代表所有订阅A的人,B也代表A不会订阅的那些人。即找到彼此不相互认购的人员名单。
这是我写的查询:
SELECT A.name, B.name
FROM subscription AS A, subscription AS B
WHERE A.subscriber=B.name AND A.name!=B.subscriber;
即它应该显示两列A和B,其中B订阅A而A不订阅B.
所有我得到的都是垃圾,有很多行重复。我在这做错了什么?
好吧,我在陈述样品时犯了一个错误。样本如下:
梅丽莎,琼订阅了约翰。 查尔斯,约翰订阅了琼。 查尔斯订阅了梅丽莎。 梅丽莎,琼想订阅查尔斯。第一部分引用订阅者列,第二部分引用name列。 也就是说,约翰是梅丽莎的名字,约翰订阅了约翰。
因此,它应该输出(梅丽莎,约翰)因为约翰没有订阅梅丽莎。这会如何改变查询?
答案 0 :(得分:1)
听起来你想要做LEFT JOIN。这将返回所有A名称并将它们链接到所有B名称。每个A名称至少会有1条记录,但可能很多。最多可以订阅名称A的B名称。如果没有B订户,则会有一个A名称,但B列的值为NULL。
SELECT A.name, B.name FROM subscription AS A
LEFT JOIN subscription AS B ON A.subscriber=B.name AND A.name!=B.subscriber;
答案 1 :(得分:1)
这将从订阅表中提取所有记录,其中订阅表中没有对应订阅的相应匹配。
select subscriber, name
from subscription a
where not exists (
select 1
from subscription b
where a.subscriber = b.name
and a.name = b.subscriber)