SQL SERVER:
Select tblActivity.RoomID, tblActivity.Time , tblRoom.RoomType
from tblActivity
Inner Join tblRoom
On tblRoom.ID = tblActivity.RoomID
Where tblActivity.Time Between 10 And 11
And tblActivity.RoomID is NULL
GROUP BY tblActivity.RoomID , tblRoom.RoomType
对不起,问题标题很模糊。真的不知道如何解释它。在这里 - 在这里我试图显示10到11之间没有使用的房间我怎么能显示它?
问题本身 - 列出早上10到11之间未使用的房间。 (5) 错误消息:消息8120,级别16,状态1,行1 专栏' tblActivity.Time'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
答案 0 :(得分:1)
对于你的逻辑,你似乎想要not exists
:
Select r.*
from tblRoom r
where not exists (select 1
from tblActivity a
where r.ID = a.RoomID and
a.Time >= 10 and
a.Time <= 11
);
使用日期/时间时,通常最好使用显式比较而不是between
,因为between
的结果可能取决于列的类型。 (对于date
/ datetime
比较尤其如此,但我只是养成习惯,而不是将其用于time
。)
答案 1 :(得分:0)
Where tblActivity.Time Between 10 And 11
与写作相同:
Where tblActivity.Time >= 10 And tblActivity.Time <= 11
请注意,SQL Server之间的区别为inclusive
,这意味着结尾(11)包含在答案中......由于许多正当理由,这被认为是一种不好的做法。所以请注意,可能并非总是如此,在更改数据库引擎时可能会有惊喜。
为什么包容性范围是一种不好的做法?
当您必须对结果进行分区时,您更愿意使用算法来处理排除范围,例如X >= 0 and X < 10
然后X >= 10 and X < 20
,而不是包含X >= 0 and X <= 9
然后X >= 10 and X <= 19
。
包容性范围意味着您必须处理数据中较小的粒度单位才能知道9与10相比是什么。使用简单的算法很容易,但是当您必须处理复杂的模式时可能会成为一个地狱。整数的最小单位是1,这很容易,但是Date或Float的最小单位是什么?
答案 2 :(得分:0)
由于between
命令,该错误并非如此。该错误表示如果您使用的是group by
,那么select
列表中的每个字段都必须是您要归类的字段之一,或者必须是汇总字段(sum
,avg
,max
等等。
您可以通过将sum(tblActivity.Time)
添加到group by
这样的
Select tblActivity.RoomID, tblActivity.Time , tblRoom.RoomType
from tblActivity
Inner Join tblRoom
On tblRoom.ID = tblActivity.RoomID
Where tblActivity.Time Between 10 And 11
And tblActivity.RoomID is NULL
GROUP BY tblActivity.RoomID , tblRoom.RoomType, tblActivity.Time
然而,即使有了这个修复,我也不认为这个查询能够为您提供您想要的东西。你真正想要的是tblRoom中所有行的列表,其中同一房间的tblActivity中没有行,时间在10到11之间。这将是一个与你所写的不同的查询。
答案 3 :(得分:-1)
使用SQL语句之间 查询是:
Select * from Table Name from Field Name
between Value1 And Value2
日期&amp;价值应用可能