При помощи предложения EXISTS
вы выбираете всех клиентов, для которых существует хотя бы одна запись order_details.
SELECT *
FROM customers c
WHERE EXISTS (SELECT * FROM order_details od WHERE od.customer_id = c.customer_id);
При объединении вы снова выбираете этих клиентов.Тем не менее, вы выбираете каждый из них так часто, как существует order_detail для них.Т.е. у вас будет много дубликатов.
SELECT c.*
FROM customers c
JOIN order_details od ON c.customer_id = od.customer_id;
Вы можете удалить дубликаты из своих результатов с помощью DISTINCT
, чтобы получить каждого клиента только еще раз:
SELECT DISTINCT c.*
FROM customers c
JOIN order_details od ON c.customer_id = od.customer_id;
Но почемусоздать все дубликаты только для того, чтобы снова их удалить?Не делай этого.Присоединяйтесь только тогда, когда вы действительно хотите объединить результаты.
Другой вариант, который я считаю даже более читабельным, чем предложение EXISTS
, это, кстати, предложение IN
.Это был бы мой способ написания запроса:
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM order_details);