Как правильно использовать оператор exists в mysql?

Я хочу, чтобы оператор EXISTS перечислил имена клиентов, у которых нет заказов

Итак, у меня есть две таблицы (как показано ниже). Одна с именем Customer, которая содержит CustomerName и CustomerID, а другая - с именами заказов, которые содержат CustomerID, а также OrderID. Я пытался

ВЫБЕРИТЕ CustomerName, CustomerID ОТ клиента, ГДЕ СУЩЕСТВУЕТ (

ВЫБЕРИТЕ CustomerID, OrderID ИЗ заказов ГДЕ OrderID ‹> CustomerID);

но он работает не так, как я хотел.


person Frightlin    schedule 22.04.2014    source источник
comment
Ваш вопрос зависит от того, что я хотел, чтобы это значило. Лучше расскажи нам.   -  person Bohemian♦    schedule 22.04.2014


Ответы (2)


Один из способов сделать это - использовать синтаксис NOT EXISTS. Лично для меня это имеет больше смысла. Думаю, вам подойдет этот запрос:

Select CustomerName
, CustomerID 
FROM Customer C 
WHERE NOT EXISTS(Select 1 FROM Orders O where C.CustomerId = O.CustomerId)
person cbarklow    schedule 22.04.2014
comment
Ты прав. Второй запрос не дал желаемых результатов. Отредактировал и удалил. - person cbarklow; 22.04.2014

«НЕ СУЩЕСТВУЕТ» - заведомо плохая программа (если MySQL не придумал для нее какую-то оптимизацию), потому что if вызывает полное сканирование таблицы.

Стандартный обходной путь - использовать внешние соединения. Не интуитивно понятный, поэтому его следует прокомментировать для будущих сопровождающих.

SELECT CustomerName, CustomerID from Customer C LEFT JOIN Orders O ON C.CustomerID = O.CustomerID WHERE O.CustomerID IS NULL

person user2781942    schedule 22.04.2014