我有这张桌子:
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.
我得到的只是垃圾,有很多行重复.我在这做错了什么?
好吧,我在陈述样品时犯了一个错误.样本是这样的:
梅丽莎,琼订阅了约翰.
查尔斯,约翰订阅了琼.
查尔斯订阅了梅丽莎.
梅丽莎,琼想订阅查尔斯.
第一部分引用订阅者列,第二部分引用名称列.
也就是说,约翰的名字和梅丽莎,约翰订阅了约翰.
因此,它应该输出(梅丽莎,约翰)因为约翰不订阅梅丽莎.
这将如何改变查询?
最佳答案 这将从订阅表中提取所有记录,其中订阅表中没有对应订阅的相应匹配.
select subscriber, name
from subscription a
where not exists (
select 1
from subscription b
where a.subscriber = b.name
and a.name = b.subscriber)