Sql server 发生了什么事情,通过询问把我的小组搞得一团糟?

Sql server 发生了什么事情,通过询问把我的小组搞得一团糟?,sql-server,query-optimization,Sql Server,Query Optimization,这是我的疑问: select top 60 * from ABC_Sessions (nolock) where EntryDate > '06-22-2012 23:59:59' GROUP BY TargetedID 然后它给了我这个错误: Msg 8120,第16级,状态1,第1行“BI_Sessions.SessionID”列为 在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句 查询中的*将扩展到表中的所有列 select top 60 TargetedID,

这是我的疑问:

select top 60 * from ABC_Sessions (nolock)   
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID
然后它给了我这个错误:

Msg 8120,第16级,状态1,第1行“BI_Sessions.SessionID”列为 在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句


查询中的
*
将扩展到表中的所有列

select top 60 TargetedID, SessionID, ...
from ABC_Sessions (nolock)
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID 
如错误消息所述,在没有聚合函数的情况下选择
SessionID
(例如
MAX
)是无效的

这将有助于:

select top 60 TargetedID, MAX(SessionID) AS MaxSessionID
from ABC_Sessions (nolock)
where EntryDate > '06-22-2012 23:59:59'
GROUP BY TargetedID 

您使用了star
*
但没有使用
abc\u sessions
表中的列分组。 在没有任何聚合函数的情况下使用
groupby
,对我来说似乎很奇怪


你想看什么?

这是一个理论问题:正如错误所说,你不允许选择你没有支配的东西。 因此,当使用简单的SELECT/FROM/WHERE查询时,FROM表中的所有内容都可以选择

但是,如果您使用分组依据,您的视野就变窄了:您在分组依据中没有使用的任何内容都将被丢弃(请三思,当您明确要求对这些行进行分组时,从多行中选择数据是没有意义的)


可能您有点困惑?

出现此错误的原因是您在select语句中未使用sum/average/count/max/min或任何类似函数。一旦使用了其中任何一个,就不会出现此错误。例如:
选择最大60个目标日期(EntryDate) 来自ABC_课程(nolock) 其中EntryDate>'06-22-2012 23:59:59'
GROUP BY TargetedID

您不能将SELECT*与GROUP BY一起使用。如果您选择了所有行,您能解释group by的含义吗?如果有两行具有相同的TargetedID,那么EntryDate和其他列需要哪一行?请显示示例数据和所需结果,而不是您尝试的无效查询和它应该返回的错误。您的问题是什么?这个错误信息对我来说似乎很清楚。