Планирование SQL - выберите все комнаты, доступные для данного диапазона дат - PullRequest
1 голос
/ 24 мая 2011

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

Я пытаюсь получить информацию о доступности комнаты, используя запросы MS, но что-то подсказывает мне, что запросы MS оставляют желать лучшего.Вот статья MS, на которую я ссылаюсь: http://support.microsoft.com/kb/245074

Как я могу получить доступные комнаты для определенного диапазона дат?Вот мой запрос, который возвращает простой список заказов:

SELECT r.RoomID, b.BeginDate, b.EndDate
FROM tblRoom as r INNER JOIN tblBooking b ON r.RoomID = b.AssignedRoomID;

Но я все еще озадачен тем, как я могу получить список доступных номеров для данного диапазона дат?

IЯ использую Microsoft Access, но я бы хотел, чтобы мои запросы к СУБД были максимально независимыми.Хотя на самом деле это не мой вопрос, если вы считаете, что модель данных, которую я использую, неверна, скажите, пожалуйста, так как я готов рассмотреть лучший способ хранения моих данных.

Edit1:
Я не упомянул, что мне не нравятся запросы MS по двум причинам.Прежде всего, я действительно запутался в отношении трех различных операторов OR в предложении WHERE.Это действительно необходимо?Во-вторых, мне не нравится идея сохранения запроса и использования его в качестве таблицы, хотя я готов сделать это, если он выполнит свою работу, что, как я полагаю, в этом случае делает.

Edit2:
Это решение, которое я нашел, используя превосходный ответ, приведенный здесь.Это MS Access SQL диалект (простите):

SELECT * FROM tblRoom AS r  
WHERE RoomID NOT IN  
 (SELECT AssignedRoomID as RoomID From tblBooking  
  WHERE assignedroomid IS NOT NULL AND assignedroomid = r.roomid AND 
    (BeginDate < @BookingInquiryEndDate AND EndDate > @BookingInquiryBeginDate)  
 )

1 Ответ

7 голосов
/ 24 мая 2011

Вы хотите, чтобы все комнаты, у которых нет бронирования в этом диапазоне дат, например, если ваш sql engine выполняет подзапросы ...

Select * From Rooms r 
where not exists 
     (Select * From Bookings 
      Where room = r.room
         And startBooking < @endRange
         And endBooking > @startRange)

HIK, понимают необходимость помещения = r.room предложение попробуйте эти два запроса

Query One (с предложением room = r.room)

       Select r.*,
       Case Where Exists
           (Select * From Bookings 
            Where room = r.room
                 And startBooking < @endRange
                 And endBooking > @startRange) 
        Then 'Y' Else 'N' End HasBooking
    From Rooms r 

Query Two (без предложения room = r.room)

    Select r.*,
       Case Where Exists
           (Select * From Bookings 
            Where startBooking < @endRange
                 And endBooking > @startRange) 
        Then 'Y' Else 'N' End HasBooking
    From Rooms r 

Обратите внимание, что первое возвращает разные значения в HasBooking для каждой строки вывода, поскольку подзапрос 'Correleated' с внешним запросом ... он выполняется снова и снова, один раз для каждой строки результатов внешнего запроса.

Второе значение одинаково для всех строк ... Оно выполняется только один раз, потому что ничто в нем не зависит от того, для какой строки внешнего запроса он генерируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...