Я занимаюсь вопросами для книги "Проблемы практики SQL: 57 начальных, промежуточных и сложных задач, которые вы должны решить, используя подход" учиться на практике "" . Вопрос 31 -
Клиенты без заказов на EmployeeID 4
Один сотрудник (Маргарет Пикок, EmployeeID 4) разместил наибольшее количество заказов. Однако есть клиенты, которые никогда не размещали у нее заказ. Показывать только тех клиентов, которые никогда не размещали у нее заказ.
Решение, которое я сделал, создает временную таблицу "cte" и соединяет ее с существующей таблицей. Не красиво или читабельно на самом деле -
with cte as
(Select Customers.CustomerID
from customers
where CustomerID not in
(select Orders.CustomerID from orders where orders.EmployeeID = '4'))
select *
from cte left join
(select CustomerID from Orders where Orders.EmployeeID = '4') O
on cte.CustomerID = O.CustomerID
Я нашел следующее решение онлайн -
SELECT c.CustomerID, o.CustomerID
FROM Customers AS c
LEFT JOIN Orders AS o ON o.CustomerID = c.CustomerID AND o.EmployeeID = 4
WHERE o.CustomerID IS NULL;
Что лучше.
Мой вопрос - когда я могу использовать предложения OR
, AND
в JOIN
? Каковы преимущества? Это тот факт, что JOIN выполняется перед предложением where?
Спасибо
Асаф