4

给定以下选择语句:

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 中选择它来选择它吗?我不明白这个限制 - 如果我能理解为什么会发生这种情况,也许我可以调整我的查询设计。

4

2 回答 2

7

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

您需要:

. . .
group by t.name, RowId

或者:

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

即使您知道每个名称只有一个 RowId,数据库也不知道这一点,因此您必须在查询中明确说明您想要做什么。

于 2012-05-24T20:39:10.537 回答
1

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

于 2012-05-24T20:41:45.677 回答