#sql
#sql
Вопрос:
У меня есть две таблицы заказы и участники. В обеих таблицах есть поле email.
Я пытаюсь написать запрос, который возвращает мне все электронные письма участников, которые НЕ включены в порядок таблицы.
В обычных словах мой запрос гласил бы: «Выберите все электронные письма от посетителей, которые не включены в электронные письма заказа».
Я попробовал следующий запрос, но он работает не так, как я ожидал.
SELECT A.email
FROM attendee A
INNER JOIN order B ON A.order_id = B.id
WHERE A.email NOT B.email
Комментарии:
1. Какова связь между таблицами, один к одному или один ко многим? Возможно, добавьте некоторые образцы данных
Ответ №1:
Выберите все электронные письма от участников, которые не включены в электронные письма заказа
это решается с помощью NOT EXISTS
:
select a.email
from attendees a
where not exists (
select 1 from orders
where email = a.email
)
или с a LEFT JOIN
в email
столбце:
select a.email
from attendees a left join orders o
on a.email = o.email
where o.email is null
Ответ №2:
Вы должны легко использовать LEFT JOIN
и находить несоответствия, фильтруя все случаи совпадения
SELECT A.email
FROM attendee A
LEFT JOIN order B
ON A.order_id = B.id
WHERE B.email IS NULL
Комментарии:
1. К сожалению, я не получаю никаких результатов при выполнении этого запроса
2. Зачем использовать значение NULL?
3. JoeyCoder — означает, что у вас нет обращений к участникам, которые НЕ включены в порядок таблиц @JoakimDanielson, чтобы найти случаи, которые не совпадают между таблицами
4. Я попросил спровоцировать вас подумать об этом, но хорошо, я объясняю это, значение NULL — это не то же самое, что быть другим или отсутствующим. B.email может содержать адрес электронной почты, но другой, чем в другой таблице.
5. Вы, конечно, правы, но вопрос был основан на идентификаторе в качестве КЛЮЧА, поэтому я предположил, что проблема заключалась не в сравнении электронных писем, а в поиске несоответствий в идентификаторе заказа. Второй ответ идет по вашему пути. Я думаю, нам нужен @JoeyCoder для его уточнения.
Ответ №3:
В итоге я использовал Django для генерации запроса, поскольку я могу справиться с этим лучше. Рабочий результат выглядит следующим образом. Спасибо за вашу помощь, ребята.
(SELECT "attendee"."email" FROM "attendee" ORDER BY "attendee"."created" DESC) EXCEPT (SELECT "order"."email" FROM "order" ORDER BY "order"."created" DESC)
Ответ №4:
проверьте :
(select email_is from attendees) minus (select email_id from order );