SQLは化合物を使用して句を選択します
-
26-10-2019 - |
質問
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]
いつでも変換できます 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
)
使用できます 左結合 これを達成するため。
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のすべての行と、購読されている行の一致する行がない登録されていないすべての行を戻すことです - サブスクライブの行は、これらのヌルで表されます。
所属していません StackOverflow