4

次の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でselect値が必要な理由を誰かが説明できますか?私はこの制限を理解していません-なぜこれが起こっているのか理解できれば、クエリのデザインを調整できるかもしれません。

4

2 に答える 2

7

どの RowId を選択すればよいかわからないためです。

次のいずれかが必要です。

. . .
group by t.name, RowId

また:

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

名前ごとに RowId が 1 つしかないことがわかっていても、データベースはそれを認識しないため、クエリで何をしたいかを明示的に指定する必要があります。

于 2012-05-24T20:39:10.537 に答える
1

クエリの結果は、複数の ROWS の集計に基づいています。t.name同じ値と多くの異なる値を持つ多くの行を取得し、st.row_count1 つの行を作成します (t.nameこれは、集計されたすべての行で同じであり、それらのすべてのt.row_count値の合計です)。このような集計には、 の適切な値はありませんc.Row_ID。グループ化する各行には異なる値があり、どの値を使用する必要があるかを判断する方法はありません。が数値の場合はRowID、すべての ID の最小 (最小) または最大 (最大) を平均または合計することができます。意味がないわけではありません。このような値は、集計に対して単に存在します。

于 2012-05-24T20:41:45.677 に答える