请查看表结构,查询和结果。
MeetingRoom
ID | Area | RoomNo Capacity distances
--- ----- --------- ---------- ----------
1 1 R1 10 10
2 1 R3 24 4
3 8 R4 24 4
4 1 R5 10 10 ReservationTable
ReservationID RoomID DateTimeStart DateTimeEnd
------------- ----------- ----------------------- -----------------------
1 1 2013-10-10 17:00:00.000 2013-10-10 19:00:00.000 查询
Declare @Start Datetime
Declare @End Datetime
set @Start='2013-10-10 13:00:00.000'
set @End='2013-10-10 14:00:00.000'
select
MeetingRoom.ID
from
MeetingRoom
left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
Where
Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
and (Res.DateTimeStart Not Between @Start and @End)
and (Res.DateTimeEnd Not Between @Start and @End)此查询只返回一条记录,因为它应该返回4条记录
发布于 2013-01-27 19:44:13
如果在result中使用LEFT OUTER JOIN和in WHERE clause将条件设置为右侧的表,而不是IS NULL,则结果为INNER JOIN。
我想这就是你想要的。
Declare @Start Datetime
Declare @End Datetime
set @Start='2013-10-10 13:00:00.000'
set @End='2013-10-10 14:00:00.000'
select
MeetingRoom.ID
from
MeetingRoom
left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
Where
(
Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
and (Res.DateTimeStart Not Between @Start and @End)
and (Res.DateTimeEnd Not Between @Start and @End)
)
OR Res.ReservationID IS NULL我认为你必须重新表述你的WHERE条件。如果您想要完全空闲的空间(即间隔不相交),您可以使用以下命令:
WHERE
Res.DateTimeStart > @End
OR Res.DateTimeEnd < @Start
OR Res.ReservationID IS NULL 发布于 2013-01-27 19:39:57
您应该使用内部连接...编辑您必须像您正在做的那样使用外部连接,但请考虑空值与非空值的比较...
一种方法是显式接受带有OR子句的null日期值
发布于 2013-01-27 19:53:27
最好的方法是将WHERE子句中的内容上移到ON子句中:
select
MeetingRoom.ID
from MeetingRoom
left Join ResReservationTable Res on Res.RoomID = MeetingRoom.ID
and Res.DateTimeStart != @Start and Res.DateTimeEnd != @End
and Res.DateTimeStart Not Between @Start and @End
and Res.DateTimeEnd Not Between @Start and @End很快,你保留了外连接,但仍然过滤了结果,再加上你现在有了性能最好的查询版本。
连接条件可能只有“与键相关”的表达式,这是一个非常常见且不正确的假设,但实际上您可以有任何条件,即使是在连接的表中没有涉及的列上的条件。
https://stackoverflow.com/questions/14546933
复制相似问题