2016-07-01 3 views
1

первый раз задаю вопрос здесь, я кодирую приложение для резервирования на C# с помощью Visual Studio 2015, но у меня есть проблема с попыткой показать свободные комнаты в виде сетки данных, вот запрос я использую:Избегайте повторных значений в запросе SQL, заявлении о резервировании

SELECT clientID, cost, arrival, roomNumber, resvNum, departure, size 
FROM roomswithresvView 
WHERE (roomNumber NOT IN 
     (SELECT roomNumber 
      FROM roomswithresvView AS roomswithresvView_1 
      WHERE (arrival BETWEEN @date1 AND @date2) 
      OR (departure BETWEEN @date1 AND @date2))) 

проблема заключается в том, что если помещение имеет более чем одну оговорку, запрос будет показывать его несколько раз, я попытался с помощью DISTINCT, но я могу сделать работу только с одним и я не смог сделать работу GROUP BY.

Спасибо за внимание.

Query Sample

Например, если я протестировать запрос с 2016-07-06 как date1 и 2016-07-07 как date2, он повторит номер 1005, потому что у него есть две оговорки в базе данных.

+0

Но вы просите оговорки. Вы должны удалить этот вопрос и задать другой вопрос с примерными данными и желаемыми результатами. –

+0

Вы можете указать, какой столбец отличается? – NikhilSN

+0

Спасибо, я тестировал его на номере номер, вот где я могу видеть, когда комната повторяет –

ответ

0

Куда вы отправили DISTINCT?

Вам нужен стол для комнат и стол для бронирования. Тогда вам нужен подзапрос, чтобы найти оговорки, которые столкнулись с вашими запрошенными датами. Здесь вы используете DISTINCT. Затем вам нужен внешний запрос, чтобы найти все номера, не возвращенные в подзапрос. Не забывайте, что у вас есть действующее бронирование, которое начинается до и заканчивается по вашим запрошенным датам! Взяв все это, вы получите это ...

insert into room(costPerNight, roomNumber, size) 
values 
(55, 1, 13), 
(65, 2, 15), 
(85, 3, 20) 
; 

create table reservation(
id int identity (1,1) not null, 
roomId int not null, 
dateIn date not null, 
dateOut date not null 
) 

insert into reservation (roomId, dateIn, dateOut) 
values 
(1,'2016-07-01','2016-07-03'), 
(1,'2016-07-05','2016-07-08'), 
(2,'2016-07-01','2016-07-08') 
*/ 

declare @requestedDateIn date = '2016-07-03' 
declare @requestedDateOut date = '2016-07-05'; 

select * from room where id not in(
--find clashing reservations 
select distinct roomId from reservation where 
(dateOut > @requestedDateIn and dateOut < @requestedDateOut) 
or (dateIn > @requestedDateIn and dateIn < @requestedDateOut) 
or (dateIn < @requestedDateIn and dateOut > @requestedDateOut) 
) 
Смежные вопросы