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;

つまり、BがAにサブスクライブし、AがBにサブスクライブしない2つの列AとBを表示する必要があります。

私が得ているのは、多くの行が重複しているガベージだけです。私はこれで何が間違っているのですか?

さて、サンプルを述べているときに間違えました。サンプルは次のようになります。

メリッサ、ジョーンはジョンを購読します。チャールズ、ジョンはジョアンを購読します。チャールズはメリッサを購読しています。メリッサ、ジョーンはチャールズを購読します。

最初の部分はサブスクライバー列を参照し、2番目の部分は名前列を参照します。つまり、ジョンの名前とメリッサ、ジョーンはジョンを購読します。

したがって、johnはmelissaにサブスクライブしていないため、(melissa、john)を出力する必要があります。

これはクエリをどのように変更しますか?

4

2 に答える 2

1

LEFT JOIN を実行したいようです。これにより、すべての A 名が返され、それらがすべての B 名にリンクされます。A 名ごとに少なくとも 1 つのレコードがありますが、多くの場合もあります。名前 A にサブスクライブされる B の名前の数まで。B のサブスクライバーが存在しない場合、A の名前は 1 つになりますが、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 に答える