SQL选择与化合物的子句
-
26-10-2019 - |
题
我在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]
你总是可以转换 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
如果您是新手, 杰夫·阿特伍德的视觉解释 是一个很好的起点。
有效地,查询正在做的是将UBSUBSCRIB中的所有行带回到订阅中具有匹配行的所有行,并且未订阅中没有匹配行的所有行中的所有行 - 订阅中的行代表了Null的这些行。
不隶属于 StackOverflow