MYSQL сервер: Напишите запрос для отображения автомобилей, которые не были взяты в аренду - PullRequest
0 голосов
/ 09 мая 2020

Используйте таблицы Cars и Rentals для получения записей.

CARS ( car_id , car_name, car_type)

RENTALS ( rental_id , cust_id, car_id, pickup_date, km, fare)

SELECT c.car_id, c.car_name, c.car_type 
FROM cars as c, rentals as r
WHERE c.car_id=r.car_id and r.pickup_date=null 
ORDER BY c.car_id;

Я пробовал это, но вывод НЕТ ВЫБРАННЫХ СТРОК

Ответы [ 3 ]

0 голосов
/ 09 мая 2020

Изначально вы намеревались объединить две таблицы и фильтры для строк, которые не совпадали в правой части объединения. Этот метод иногда называют анти-левое соединение .

Ваша попытка не удалась, потому что вам нужен left join, а не (неявный) inner join, и потому что вы не проверили должным образом недействительность (для этого требуется оператор is null).

Фразы решения left join выглядят следующим образом:

select c.*
from cars c
left join rentals r on r.car_id = c.car_id
where r.car_id is null
order by c.car_id

Обратите внимание, что я проверяю на недействительность столбец car_id, а не pickup_date - подойдет любой столбец, который не допускает значения NULL, однако я считаю, что намерение более четкое при использовании столбца соединения.

0 голосов
/ 09 мая 2020

Простой способ сделать это: NOT IN:

SELECT car_id, car_name, car_type 
FROM cars
WHERE car_id NOT IN (SELECT car_id FROM rentals)
ORDER BY car_id;
0 голосов
/ 09 мая 2020

Я бы порекомендовал NOT EXISTS для этого запроса:

select c.*
from cars c
where not exists (select 1 from rentals r where r.car_id = c.car_id);

Тем не менее, ваш запрос содержит несколько ошибок:

  • Запятая в предложении FROM очень прошлый век. Используйте JOIN.
  • = NULL - всегда будет отфильтровывать все строки. Почти все сравнения с NULL возвращают NULL, что считается "ложным". Правильное сравнение - IS NULL, но я не думаю, что это необходимо.
  • Вы можете указать эквивалент logi c, используя LEFT JOIN, но я думаю, что NOT EXISTS ближе к формулировке вопрос.
...