web-dev-qa-db-ja.com

SQL Server更新グループ

私はこれをMS-SQLで実行しようとしていますが、Group by lineでエラーを返します

update #temp
Set Dos=Count(1)
From Temp_Table2010 s
where Id=s.Total and s.total in (Select Id from #temp)
group by s.Total

優れたパフォーマンスを発揮してこの問題を解決する方法を誰もが知っていますか?.

40
Gerardo Abdo

試してみる

;with counts 
AS 
( 
    SELECT total, COUNT(*) as dos
    FROM temp_table2010 
    WHERE total in (select id from #temp)
)
UPDATE T 
SET dos=counts.dos
FROM #temp T 
INNER JOIN counts 
    ON t.id = counts.total 
60
Code Magician

SQL Serverでは、更新クエリで集計を実行できます。サブクエリで集計を実行し、更新するテーブルで結合するだけです。

UPDATE  #temp
SET     Dos = Cnt
FROM    #temp 
    INNER JOIN (SELECT Total, COUNT(*) AS Cnt FROM Temp_Table2010 GROUP BY Total) AS s
        ON Id = s.Total 

これを行う:

WHERE total in (select id from #temp)

その後:

 INNER JOIN counts 
    ON t.id = counts.total 

冗長です。

結合は、「合計(...)」要件を解決します。キーでグループ化してから参加します。

21
MattInNY

まず、UPDATEクエリで集計を使用することはできません。元の質問にエラーメッセージを含めていませんでしたが、それが伝えていることだと思います。

更新前に集計を計算し、結果を一時テーブルに保存してから、そのテーブルに結合して更新を行う必要があります。

12
SqlRyan