Пользовательский запрос для получения данных, которых нет в другой таблице

#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 );