SQL - INNER JOIN с AND против использования подзапроса - PullRequest
0 голосов
/ 15 мая 2019

Я занимаюсь вопросами для книги "Проблемы практики 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?

Спасибо

Асаф

Ответы [ 2 ]

1 голос
/ 15 мая 2019
Условие

A JOIN может содержать любое логическое сравнение, даже подзапросы, использующие EXISTS и коррелированные подзапросы. Нет ограничений на то, что можно выразить.

Просто примечание, однако. = и AND хороши для производительности. Неравенство, как правило, влияет на производительность.

Что касается вашей конкретной проблемы, я думаю, что следующее является более прямым толкованием вопроса:

SELECT c.CustomerID
FROM Customers c
WHERE NOT EXISTS (SELECT 1
                  FROM Orders o 
                  WHERE o.CustomerID = c.CustomerID AND
                        o.EmployeeID = 4
                 );

То есть, получить всех клиентов, для которых нет заказа с сотрудником 4.

0 голосов
/ 15 мая 2019

Как правило, я бы рекомендовал всегда выбирать наиболее читаемую версию запроса, если только вы не можете измерить разницу в производительности с реалистичными данными. Оптимизатор, основанный на затратах, должен выбрать хороший способ выполнения запроса, чтобы в этом случае получить нужные вам результаты.

Для меня JOIN - это лот , более читабельный, чем CTE.

...