SQL Select Clause с соединением
-
26-10-2019 - |
Вопрос
У меня есть две таблицы поиска/справочных данных (подписанные и отписанные) в моей базе данных 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 для них.