如何使用多个值更新多个行?

时间:2012-04-24 15:55:57

标签: sql performance sql-update inner-join bulk

好吧,我有一张桌子

id       | idtable2|value   | code   |name       |
1        |     3   |983     |  10    |Total      |
2        |     4   |89      |  10    |type 4     |
3        |     5   |299     |  10    |type 5     |
4        |     6   |0       |  10    |type 6     |
5        |     7   |72      |  10    |type 7     |
6        |     8   |523     |  10    |type 8     |
7        |     4   |        |  11    |percentaje4|
8        |     5   |        |  11    |percentaje5|
9        |     6   |        |  11    |percentaje6|
10       |     7   |        |  11    |percentaje7|
11       |     8   |        |  11    |percentaje8|

我有我的价值观,我需要有他们的百分比。 这些百分比基于您可以看到的值。 举例来说,我的行为id 7,我可以做到这一点

declare @total int
set @total=(select value from table where name='total')
update table set value=(select value from table where code=1' and name='type 4')/@total

我需要为所有百分比的行做这件事,但这是一张dinamic表。 在另一个表中,我有一个id和一个名字(table1.name it's equals to table2.name) 每个代码(10,11)的table1将有一个名称(来自table2)

如何获得此值?我尝试了查询。

update ce set valor=valor/@total from #table1 ce inner join table2 m
on ce.t2id=m.id 
where codigo=10

但是我用代码10更新了值,而不是代码11的值。 我怎么能这样做?

3 个答案:

答案 0 :(得分:0)

删除where子句并完成:

update ce set valor=valor/@total from #table1 ce inner join table2 m
on ce.t2id=m.id 

您无需指定任何内容:)

答案 1 :(得分:0)

通过使用IN:

,您可以在where子句中拥有多个值
update ce set valor=valor/@total from #table1 ce inner join table2 m
on ce.t2id=m.id 
where codigo in (10, 11)

答案 2 :(得分:0)

如果你在idTable2上加入#table1并用codigo = 10过滤掉一个,用codigo = 11过滤另一个,你可以使用codigo = 10的valor来计算codigo的百分比= 11。

update ce11 
   set valor=ce10.valor/@total 
from #table1 ce11 
  inner join #table1 ce10 
     on ce11.idTable2 = ce10.idTable2
    and ce11.codigo = 11
    and ce10.codigo = 10