#sql
#sql
Вопрос:
У меня возникли проблемы с запросом к моей базе данных.. У меня есть таблица :
**Room**
----------------------------------
|RoomNo---RoomStatusID---RoomTypeID|
| 1 --- 1 --- 1 |
| 2 --- 1 --- 1 |
----------------------------------
**ClientRoom**
--------------------------------------------------------------------
|ClientRoomNo---RoomNo--------ArrivalDate-------------DepartureDate |
| 1 --- 1 ---- 2011-10-03 1:00:00 ---- 2011-10-03 4:00:00|
| 2 --- 1 ---- 2011-10-03 5:00:00 ---- 2011-10-03 8:00:00|
--------------------------------------------------------------------
Если я использую этот запрос =
SELECT Room.RoomNo, RoomType.RoomType
FROM Room INNER JOIN
RoomType ON Room.RoomTypeNo = RoomType.RoomTypeNo
FULL OUTER JOIN ClientRoom ON Room.RoomNo = ClientRoom.RoomNo
WHERE
(((ClientRoom.ArrivalDate <= '10-03-2011 1:00:00' AND
ClientRoom.ArrivalDate <= '10-03-2011 5:00:00') AND
(ClientRoom.DepartureDate <= '10-03-2011 1:00:00' AND
ClientRoom.DepartureDate <= '10-03-2011 5:00:00'))
OR Room.RoomStatusId = 1)
Он вернется
**ClientRoom**
--------------------------------------------------------------------
|ClientRoomNo---RoomNo--------ArrivalDate-------------DepartureDate |
| 2 --- 1 ---- 2011-10-03 5:00:00 ---- 2011-10-03 8:00:00|
--------------------------------------------------------------------
Потому что он доходил до 5:00 утра.
Но когда я меняю время прибытия и отъезда на .. 5:00 — 8:00..
Номер 1 все еще находится в результатах.
Я уже пробовал НЕ МЕЖДУ 🙁
Комментарии:
1. Что находится в таблице RoomType? Почему вы используете ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ? Это гарантирует, что все строки из обеих таблиц (LHS и RHS FOJ) будут отображаться в выходных данных, даже если совпадений нет.
2. RoomType содержит тип комнаты, это не имеет значения для запроса. Я использую FOJ для объединения всех доступных комнат в комнате и клиентской комнате
3. @TheOxblood — в нынешнем виде у вас есть два избыточных предложения where . Все операторы есть
<=
, вы можете удалить<=.. 1:00:00
alltogether .4. Извините, я новичок здесь в stackoverflow 🙂
5. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда
Ответ №1:
Вы не объяснили, какой результат вы хотите получить при каких обстоятельствах. Но это условие
ClientRoom.ArrivalDate <= '10-03-2011 1:00:00' AND
ClientRoom.ArrivalDate <= '10-03-2011 5:00:00'
выглядит подозрительно, потому что первая часть избыточна. Вы могли бы просто сказать
ClientRoom.ArrivalDate <= '10-03-2011 5:00:00'
То же самое для следующей части:
ClientRoom.DepartureDate <= '10-03-2011 1:00:00' AND
ClientRoom.DepartureDate <= '10-03-2011 5:00:00'
Это то же самое, что просто сказать:
ClientRoom.DepartureDate <= '10-03-2011 5:00:00'
Редактировать: из комментариев, которые я прочитал, следует, что у вас есть заданный временной интервал (a, d) и вы хотите проверить для каждой строки, совпадает ли ваш временной интервал с временным интервалом строки (A, D). Вы хотите видеть только неперекрывающиеся строки.
Это означает, что ваше WHERE
предложение должно быть похоже на этот квазикод:
WHERE d <= A -- my departure will be before the rows arrival
OR a >= D -- my arrival is behind the rows departure
В полных терминах:
WHERE ( '10-03-2011 5:00:00' <= ClientRoom.ArrivalDate
OR '10-03-2011 1:00:00' >= ClientRoom.DepartureDate
)
OR Room.RoomStatusId = 1
Правка 2:
Что делает запрос с этим исправлением? «Покажите мне все строки расписания, которые не конфликтуют с моим расписанием». Но запрос должен быть «Покажите мне комнаты, в которых нет конфликтов с моим расписанием». Это совершенно другой зверь, но его легко перевести на SQL:
SELECT
Room.RoomNo
FROM Room
WHERE NOT EXISTS (
SELECT 1
FROM ClientRoom
WHERE
Room.RoomNo = ClientRoom.RoomNo
AND ( '10-03-2011 5:00:00' <= ClientRoom.ArrivalDate
OR '10-03-2011 1:00:00' >= ClientRoom.DepartureDate
)
)
OR Room.RoomStatusId = 1
Комментарии:
1. Я также использую NOT BETWEEN, но те же результаты. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда
2. @TheOxblood — вы приняли этот ответ как правильный, но, судя по вашим комментариям, похоже, что это не решает вашу проблему. Какой это?
3. Я хочу получить все доступные номера. Я не хочу извлекать номера, УКАЗАННЫЕ во время моего прибытия и отъезда
4. В каких терминах? Синтаксическая ошибка? Неправильные результаты? Вы использовали точную версию, которая видна сейчас ?
5. @TheOxblood, пожалуйста, подумайте над этим вопросом также на мета-уровне: просматривая разговоры — почему потребовалось так много времени, чтобы получить ответ? Должен ли я предоставить более конкретные примеры или описание? И так далее. Это очень поможет вам в следующем вопросе.