Я создал простой запрос, чтобы узнать, какая вилла будет свободна в течение определенного диапазона дней (checkin_date и checkout_date).
Однако теперь, когда я думаю об этом, я не думаю, что мой запрос ниже вернет правильные результаты:
SELECT DISTINCT default_villa_type
FROM villa, reservation
WHERE villa.villa_type = reservation.default_villa_type
and res_checkin_date not between '2011-12-21' and '2011-12-23'
and res_checkout_date not between '2011-12-21' and '2011-12-23'
Мне нужен запрос для использования:
Таблица вилл со следующими столбцами:
(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan)
Таблица резервирования со следующими столбцами:
(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan)
Я не верю, что он правильно использует обе таблицы, чтобы определить, какие типы вилл все еще доступны в соответствии с датами, введенными в запрос, но я могу ошибаться, мне нужен свежий взгляд, чтобы взглянуть на это.
1 ответ
Вы можете попытаться сначала найти все виллы, которые НЕ бесплатны, поскольку у вас нет записей, представляющих бесплатные виллы, а только записи, представляющие платные виллы.
SELECT villa_id
FROM villa
WHERE villa_type NOT IN (
SELECT default_villa_type
FROM reservation
--reservations starting within range
WHERE res_checkin_date > '2011-12-21'
AND res_checkin_date < '2011-12-23'
--reservations starting before range and ending after range
OR (
res_checkin_date <= '2011-12-21'
AND res_checkout_date > '2011-12-21'
)
--reservations ending within range
OR (
res_checkout_date > '2011-12-21'
AND res_checkout_date < '2011-12-23'
)
)
Другой способ, согласно комментарию Микаэля, может быть:
SELECT villa_id
FROM villa
WHERE villa_type NOT IN (
SELECT default_villa_type
FROM reservation
WHERE res_checkin_date < '2011-12-23'
AND res_checkout_date > '2011-12-21'
)
Я также предлагаю вам использовать переменные вместо статических строковых дат.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql-server
Microsoft SQL Server — это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков Microsoft SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. д.). Не используйте этот тег для вопросов по программному обеспечению и разработке мобильных устройств, если только он не связан напрямую с базой данных.
villa_id
в таблицеreservation
? Откуда вы знаете, какая вилла была забронирована?