Вопрос

У меня есть две таблицы поиска/справочных данных (подписанные и отписанные) в моей базе данных Microsoft SQL Server 2008 со следующей структурой:

UserId int
PublicationId int

Эти поля индексируются вместе как составной индекс.

Я хочу найти все записи, которые существуют в неподписанной таблице, которые не имеют соответствующей записи в подписанной таблице (соответствует пользователю и 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

Если вы новичок в присоединении, Визуальное объяснение Джеффа Этвуда это хорошее место для начала.

По сути, что делает запрос, так это возвращение всех рядов в UbsubScribled, которые имеют соответствующую строку в подписанном, и все строки в неподписанных, которые не имеют соответствующих строк в подписке - ряды в подписке представлены с NULL для них.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top