У меня есть следующий запрос, который работает должным образом:
SELECT insent.id, notifications.id
FROM insent
WHERE insent.id IN (
SELECT insent_id
FROM notifications
);
Это работает, как ожидалось, но я хочу преобразовать его в запрос с соединением. Я могу сделать это:
SELECT
insent.id,
notifications.id
FROM insent
JOIN notifications ON notifications.insent_id = insent.id
но поскольку для каждой входящей записи может существовать несколько записей уведомлений, это дает больше результатов, чем при первой комбинации запроса / подзапроса.
Любая идея, как я могу показать только одну отправленную запись, если для нее существует несколько записей уведомлений?
Возможный дубликат Как использовать поле из подзапроса в MySQL?
Поскольку вы присоединяетесь к id, значения из обеих таблиц всегда будут одинаковыми. Чего вы пытаетесь достичь, используя обе ценности? Или вас действительно интересует какое-то другое поле из таблицы insent?






Просто используйте distinct, чтобы избежать дублирования insent
SELECT distinct
insent.id
FROM insent
JOIN notifications ON notifications.insent_id = insent.id
Я считаю, что решение с использованием IN намного лучше. Оптимизатор запросов, скорее всего, будет использовать полусоединение.
SELECT insent.id
FROM insent
WHERE insent.id IN (
SELECT insent_id
FROM notifications
)
ОДНАКО, неясно, как может работать первый запрос, который вы указываете в своем вопросе? Вы не можете получить доступ к атрибуту, вложенному в подзапрос конструкции IN, из внешнего запроса.
Не уверен, что это именно то, что ищет человек, они указали, что на каждую отправленную запись приходится несколько уведомлений.
Джо Селко, автор SQL for Smarties, предлагает использовать предикат IN именно по этой причине. Вы не хотите использовать SELECT DISTINCT, потому что он использует внутренний курсор, который замедляет работу с большими наборами данных и способствует плохому дизайну. Вы буквально пытаетесь ограничить получаемые результаты тем, какие идентификаторы существуют в другой таблице. Ваш первый запрос с использованием предиката IN - лучший запрос.
Обратите внимание, что в своем первом запросе OP получает данные из таблицы notifications, которая недоступна в предложении IN(..). Так что ему в любом случае нужно присоединиться.
Хороший вопрос, @MadhurBhaiya. В этой ситуации его книга указывает на проблемы с нормализацией, но реальные данные не всегда соответствуют правилам;).
Можно попробовать с ROW_NUMBER
SELECT r.NotificationId,InsentId
FROM ( SELECT
insent.id AS InsentId,
notifications.id AS NotificationId,
ROW_NUMBER () OVER ( PARTITION BY i.id ORDER BY i.Id ) AS rn
FROM insent i
JOIN notifications n ON n.insent_id = i.id ) as r
WHERE rn=1
SELECT
insent.id,
notifications.id
FROM insent
JOIN (select distinct id, insent_id from notifications)notifications ON notifications.insent_id = insent.id
Вы можете использовать пункт
DISTINCTилиGROUP BY.