Предложение выбора SQL с составным - PullRequest
0 голосов
/ 16 февраля 2012

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

UserId int
PublicationId int

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

То, что я хочу сделать, - это найти все записи, которые существуют в таблице «Отписавшиеся», у которых нет совпадающих записей в таблице «Подписка» (совпадающие идентификаторы UserId и PublicationId)

Функционально что-то нужнокак:

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

Кто-нибудь может указать мне правильное направление?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012
SELECT PublicationId, UserId
FROM   Unsubscribed
MINUS
SELECT PublicationId, UserId
FROM   Subscribed
2 голосов
/ 16 февраля 2012

Вы всегда можете конвертировать 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
)
2 голосов
/ 16 февраля 2012

Вы можете использовать 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]
1 голос
/ 16 февраля 2012

Вы можете использовать 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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...