0

Microsoft SQL Server 2008データベースに次の構造の2つのルックアップ/参照テーブル(サブスクライブおよびアンサブスクライブ)があります。

UserId int
PublicationId int

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

私ができるようにしたいのは、サブスクライブされたテーブルに一致するレコード(UserIdとPublicationIdに一致する)がない、サブスクライブされていないテーブルに存在するすべてのレコードを見つけることです。

機能的には、次のようなものが必要です。

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

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

ありがとう。

4

4 に答える 4

3
SELECT PublicationId, UserId
FROM   Unsubscribed
MINUS
SELECT PublicationId, UserId
FROM   Subscribed
于 2012-02-16T12:50:31.317 に答える
2

を使用し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を使用している場合は、キーワードを使用できますExceptIntersect反対のキーワードを使用します)。

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

EXCEPT

SELECT [PublicationId], [UserId]
FROM [Subscribed]
于 2012-02-16T12:49:45.250 に答える
2

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

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
)
于 2012-02-16T12:57:18.160 に答える
1

LEFT JOINを使用して、これを実現できます。

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

に参加するのが初めての場合は、JeffAtwoodの視覚的な説明から始めるのがよいでしょう。

事実上、クエリが実行しているのは、サブスクライブされた行が一致するubsubscribedのすべての行と、サブスクライブされた行が一致しないサブスクライブされていないすべての行を戻すことです。サブスクライブされた行は、これらに対してNULLで表されます。

于 2012-02-16T12:50:28.323 に答える