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

enter image description here

Правила следующие: Автомобили, на которые не поступили заказы от клиентов из города x. Автомобили, для которых нет бронирований из таблицы БРОНИРОВАНИЕ.

Буду признателен за любую помощь, которую я могу получить.

SELECT DISTINCT f.licenseplateNo, Model FROM Car c
JOIN Booking b
ON  c.licenseplateNo = b.licenseplateNo
JOIN Customer c
ON c.customerID = b.customerID
WHERE c.Ort <> 'cityname'
ORDER BY licenseplateNo ASC

SELECT f.licenseplateNo, Model FROM Cars c
WHERE NOT EXISTS
(SELECT b.licenseplateNo FROM Booking b WHERE b.licenseplateNo = c.licenseplateNo);

Проблема с этим кодом отображается в виде двух отдельных вопросов.

sql
1
Dennis 5 Окт 2013 в 19:34
Как связать таблицы cars и bookings?
 – 
Guillaume Poussel
5 Окт 2013 в 19:38
Вот дерьмо. LicenseplateNo также находится в разделе БРОНИРОВАНИЕ. Извините.
 – 
Dennis
5 Окт 2013 в 19:40
Какой у меня код на шведском. Я пробовал использовать NOT EXISTS для извлечения того, чего LicenseplateNO не существует в BOOKINGS, и этот работает.
 – 
Dennis
5 Окт 2013 в 19:40
Обновите диаграмму или исправьте ее в коде ....
 – 
Menelaos
5 Окт 2013 в 19:45
Надеюсь, теперь это немного яснее.
 – 
Dennis
5 Окт 2013 в 20:07

1 ответ

Лучший ответ

Автомобили, на которые не поступили заказы от клиентов из города x

select *
from bookings b, customers c, cars ca
where b.licenseplateNo = ca.licenseplateNo
and c.CustomerID = b.CustomerID
where not c.city = x;

Автомобили, для которых нет заказов из таблицы БРОНИРОВАНИЕ .

select *
from cars c
where not exists (
  select b.licenseplateNo 
  from bookings b
  where b.licenseplateNo = c.licenseplateNo
);

Вы также можете выполнить второй запрос с левым внешним соединением между автомобилями и бронированиями и проверить на ноль.

Автомобили, для которых нет заказов из таблицы BOOKING и нет заказов от клиентов из города x

Требование исключить автомобиль из определенного города клиента бронирования исключает подмножество требования исключить все автомобили, для которых есть бронирование. Следовательно, второй запрос tge позаботится об этом, если, конечно, мы не хотим ОБЪЕДИНЕНИЕ двух результатов запроса.

Вы можете выполнить объединение двух запросов, чтобы получить объединенные результаты.

Другой лучший вариант - изменить ваш 1-й запрос, чтобы использовать левое соединение между автомобилем и бронированием, и добавить или проверить значение null в вашем месте.

SELECT DISTINCT f.licenseplateNo, Model
FROM Car c
LEFT JOIN Booking b
ON c.licenseplateNo = b.licenseplateNo
LEFT JOIN Customer c
ON c.customerID = b.customerID
WHERE c.Ort <> 'cityname'
OR c.Ort is NULL
ORDER BY licenseplateNo ASC;
1
Yawar 5 Окт 2013 в 22:42
Есть ли способ сделать так, чтобы это было в одном запросе?
 – 
Dennis
5 Окт 2013 в 20:32
Обновленный ответ. Может кто-нибудь отформатировать код, потому что не может с iphone.
 – 
Menelaos
5 Окт 2013 в 22:12
Привет. Это дает результаты, которых я ищу. Спасибо! Однако я не понимаю, как "c.Ort is NULL" дает мне результаты по автомобилям, которые еще не были забронированы.
 – 
Dennis
6 Окт 2013 в 02:24
Это из-за левых стыков. Левое соединение означает, что отображаются все автомобили. Однако для xars без резервирования столбцы таблицы бронирования и клиента имеют значение NULL. Если бы вы использовали обычное присоединение, это не сработало бы, так как отображались бы только автомобили с бронированиями и бронирования с клиентами.
 – 
Menelaos
6 Окт 2013 в 02:48