首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么此查询仅返回1行?

为什么此查询仅返回1行?
EN

Stack Overflow用户
提问于 2013-01-27 19:36:10
回答 4查看 111关注 0票数 2

请查看表结构,查询和结果。

MeetingRoom

代码语言:javascript
复制
   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

代码语言:javascript
复制
ReservationID RoomID      DateTimeStart           DateTimeEnd             
------------- ----------- ----------------------- ----------------------- 
1             1           2013-10-10 17:00:00.000 2013-10-10 19:00:00.000 

查询

代码语言:javascript
复制
 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条记录

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-27 19:44:13

如果在result中使用LEFT OUTER JOIN和in WHERE clause将条件设置为右侧的表,而不是IS NULL,则结果为INNER JOIN

我想这就是你想要的。

代码语言:javascript
复制
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条件。如果您想要完全空闲的空间(即间隔不相交),您可以使用以下命令:

代码语言:javascript
复制
WHERE
   Res.DateTimeStart > @End
   OR Res.DateTimeEnd < @Start
   OR Res.ReservationID IS NULL 
票数 4
EN

Stack Overflow用户

发布于 2013-01-27 19:39:57

您应该使用内部连接...编辑您必须像您正在做的那样使用外部连接,但请考虑空值与非空值的比较...

一种方法是显式接受带有OR子句的null日期值

票数 2
EN

Stack Overflow用户

发布于 2013-01-27 19:53:27

最好的方法是将WHERE子句中的内容上移到ON子句中:

代码语言:javascript
复制
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

很快,你保留了外连接,但仍然过滤了结果,再加上你现在有了性能最好的查询版本。

连接条件可能只有“与键相关”的表达式,这是一个非常常见且不正确的假设,但实际上您可以有任何条件,即使是在连接的表中没有涉及的列上的条件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14546933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档