繁体   English   中英

T-SQL - 必须在group by或aggregate函数中选择

[英]T-SQL - Must have term in group by or aggregate function to select

给出以下select语句:

Select t.name,  SUM(st.row_count) as row_count
From sys.dm_db_partition_stats st  
join sys.tables t on t.object_id = st.object_id
join ClientUpdateConfig c on t.name = c.TableName
Where  (index_id < 2)  and  schema_id = schema_id('dbo') 
and t.type ='U'
group by t.name

我还想选择c.RowID作为附加字段。 查询按原样运行,但如果我像1那样更改为:

Select t.name,  SUM(st.row_count) as row_count, c.RowID as current_row

我收到错误:

消息8120,级别16,状态1,行1列“ClientUpdateConfig.RowID”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

有人可以解释为什么我需要聚合函数中的选择值(我假设是SUM)或者在group by中选择它吗? 我不明白这个限制 - 如果我能理解为什么会这样,我可以调整我的查询设计。

因为它不知道选择哪个RowId。

你需要:

. . .
group by t.name, RowId

要么:

select . . ., min(RowId) -- or max(RowId)

即使您知道每个名称只有一个RowId,数据库也不知道,因此您必须明确说明您要在查询中执行的操作。

查询结果基于多个ROWS的聚合。 您使用相同的t.name以及它们的许多不同的st.row_count值来获取许多行并创建一行( t.name对于每个聚合行和它们所有t.row_count值的总和相同)。 对于这样的聚合, c.Row_ID没有明显的价值。 您分组的每一行都有不同的值,并且无法确定应使用的值。 如果RowID是数字,您可以对所有ID进行平均或求和,或者取最小(最小)或最大(最大)。 并不是说它有任何意义 这样的值对于聚合来说就是存在的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM