質問

Microsoft SQL Server 2008データベースには、次の構造を持つ2つのルックアップ/参照テーブル(購読および登録解除)があります。

UserId int
PublicationId int

これらのフィールドは、複合インデックスとして一緒にインデックス化されています。

私ができることは、購読されているテーブルに一致するレコードがない(userid and publicationId)に存在するテーブルに存在するすべてのレコードを見つけることです。

機能的には、次のようなものが欲しいです。

select PublicationId, UserId
from Unsubscribed
where PublicationId, UserId not in (
   select PublicationId, UserId
   from Subscribed
)

誰かが私を正しい方向に向けることができますか?

ありがとう。

役に立ちましたか?

解決

SELECT PublicationId, UserId
FROM   Unsubscribed
MINUS
SELECT PublicationId, UserId
FROM   Subscribed

他のヒント

使用できます left join 一致しない出版物とユーザーを見つける。

SELECT U.[PublicationId], U.[UserId]
FROM [Unsubscribed] AS U
    LEFT JOIN [Subscribed] AS S ON S.[PublicationId] = U.[PublicationId]
        AND S.[UserId] = U.[UserId]
WHERE S.[PublicationId] IS NULL
    AND S.[UserId] IS NULL

または、Microsoft SQL Server 2005/2008を使用している場合は、 Except キーワード(使用してください Intersect 反対のキーワード)。

SELECT [PublicationId], [UserId]
FROM [Unsubscribed] 

EXCEPT

SELECT [PublicationId], [UserId]
FROM [Subscribed]

いつでも変換できます INEXISTS. 。あなたの場合、これは次のようになります:

select PublicationId, UserId
from Unsubscribed
where
   not exists (
      select *
      from Subscribed
      where Subscribed.PublicationId = Unsubscribed.PublicationId
         and Subscribed.UserId = Unsubscribed.UserId
   )

ちなみに、Oracleを使用している場合は、実際に元の意図を直接実装できます(いくつかの括弧を追加するだけです):

select PublicationId, UserId
from Unsubscribed
where (PublicationId, UserId) not in (
   select PublicationId, UserId
   from Subscribed
)

使用できます 左結合 これを達成するため。

SELECT U.*, S.PublicationId
FROM Unsubscribed U
LEFT JOIN Subscribed S ON U.PublicationId = S.PublicationId AND U.UserId = S.UserId
WHERE S.PublicationId IS NULL

参加するのが初めての場合、 ジェフ・アトウッドの視覚的説明 開始するのに適した場所です。

事実上、クエリが行っているのは、購読されている一致する行を持つUBSUBScribeのすべての行と、購読されている行の一致する行がない登録されていないすべての行を戻すことです - サブスクライブの行は、これらのヌルで表されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top