SQL Server更新组

Ger*_*bdo 42 sql group-by sql-update

我试图在MS-SQL上执行此操作,但只是在逐行返回错误

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
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个性能良好的问题.

Cod*_*ian 62

尝试

;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 
Run Code Online (Sandbox Code Playgroud)

  • 这被称为使用公用表表达式(或CTE.)一些文档 - https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx和https:// msdn .microsoft.com/EN-US /库/ ms175972.aspx (3认同)
  • 当不是语句的开始时,“ with”表示其他含义。分号在T-sql中是可选的,因此解析器必须推断分号应该去哪里。如果在CTE之前紧跟着一条select语句,那么如果with是前一条语句的一部分或它自己的语句,则对解析器来说是模棱两可的。领先的分号使之明确。它已被采纳为约定,以防止任何解析问题。 (3认同)

小智 21

在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 
Run Code Online (Sandbox Code Playgroud)

这样做:

WHERE total in (select id from #temp)
Run Code Online (Sandbox Code Playgroud)

然后:

 INNER JOIN counts 
    ON t.id = counts.total 
Run Code Online (Sandbox Code Playgroud)

多余.

联接解决了"总在(...)"的要求.组上键然后加入.


Sql*_*yan 13

您不能在UPDATE查询中使用聚合,对于初学者 - 虽然您没有在原始问题中包含错误消息,但我怀疑这是它告诉您的内容.

您需要在更新之前计算聚合并将结果存储在临时表中,然后加入该表以进行更新.