我在Microsoft SQL Server 2008数据库中有两个查找/参考表(已订阅和未订阅),具有以下结构:

UserId int
PublicationId int

这些字段作为复合索引一起索引在一起。

我想做的是在未订阅的表中找到所有在订阅表中没有匹配记录的记录

从功能上讲,我想要类似的东西:

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

如果您是新手, 杰夫·阿特伍德的视觉解释 是一个很好的起点。

有效地,查询正在做的是将UBSUBSCRIB中的所有行带回到订阅中具有匹配行的所有行,并且未订阅中没有匹配行的所有行中的所有行 - 订阅中的行代表了Null的这些行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top