4

我有这张桌子:

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。

我得到的只是很多行重复的垃圾。我在这做错了什么?

好吧,我在说明样品时犯了一个错误。样本是这样的:

梅丽莎,琼订阅约翰。查尔斯,约翰订阅琼。查尔斯订阅了梅丽莎。梅丽莎,琼订阅查尔斯。

第一部分是指订阅者列,第二部分是指名称列。即,约翰的名字和梅丽莎,琼订阅约翰。

因此,它应该输出 (melissa,john) 因为 john 不订阅 melissa。

这将如何改变查询?

4

2 回答 2

1

听起来你想做一个 LEFT JOIN。这将返回所有 A 名称并将它们链接到所有 B 名称。每个 A 名称将至少有 1 条记录,但可能很多。最多有多少个 B 名字订阅了名字 A。如果没有 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;
于 2012-11-13T02:39:28.813 回答
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)
于 2012-11-13T03:26:17.013 回答