避免SQL查询中重复的值,保留应用程序
本文关键字:保留 应用程序 SQL 查询 避免 | 更新日期: 2023-09-27 17:53:33
我第一次在这里问一个问题,我正在使用Visual Studio 2015编写c#预订应用程序,但我有一个问题,试图在数据网格视图上显示空闲房间,这是我使用的查询:
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工作。
谢谢你的关注。
查询示例例如,如果我用2016-07-06作为日期e1, 2016-07-07作为日期e2来测试查询,它将重复房间1005,因为它在数据库上有两个预订。
你把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)
)