sqlserver 关联表批量更新多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 关联表批量更新多行相关的知识,希望对你有一定的参考价值。

最近遇到的一个问题(表字段比较多),以如下为例:
表A有字段id(主键),name1,name2,name3
表B有字段id(主键),name1,name2
比如表A有4条记录,表B有8条记录(包涵表A的记录)
怎么根据id相等,批量更新A表的多行记录(name1,name2)

参考技术A update a set a.name1 = b.name1, a.name2=b.name2
from 表A a, 表B b where a.id=b.id本回答被提问者采纳
参考技术B UPDATE
A
SET
A.name1 = B.name1,
A.name2 = B.name2
FROM
A JOIN B
ON (A.id = B.id);

参考资料:http://hi.baidu.com/wangzhiqing999/blog/item/0d6aaaf780a98b42352accd4.html

sqlserver关联更新问题

大家都知道update更新语句:update 表名 set 字段=值。似乎很简单

但是今天我遇到这样一个问题:我需要更新一张叫PO_SPECIAL_TASK_LINE表的score字段,这个分数通过另外一张打分详情表(special_assessment_score_detail)计算出来的,

他们之间的关联是字段是taskId和taskLineID。

好了,我马上就写出了如下语句:

update PO_SPECIAL_TASK_LINE

set score=(

SELECT SUM(score) FROM
(SELECT AVG(CONVERT(decimal,score)) score,TASK_LINE_ID FROM dbo.special_assessment_score_detail WHERE TASK_ID=‘‘
GROUP BY TASK_LINE_ID,SPECIAL_INDICATORS_ID) a
GROUP BY TASK_LINE_ID

)

where task_id=‘‘

 

目的很简单,通过一张打分表算出当前任务的所有行的每个指标的平均分并求和更新到任务行表的对应行中

上面的写法如果是一个任务只有一行是没有问题的,但是如果一个任务有多行数据,我需要批量更新的话,显然这是不行的。

那么这里就用到了update的高级用法(自我称之为高级):

update 表1

set 表1.score=表2.score

from 表1,

表2

where 表1.task_line_id=表2.task_line_id

这里的表2可以是一个查询视图,老铁们是不是觉得很高级,这样不管表2中有几个score,都可以对应更新到表1中了

这里也贴上我在项目中的源码:

UPDATE dbo.PO_SPECIAL_TASK_LINE
SET PO_SPECIAL_TASK_LINE.SCORE=a.score
FROM PO_SPECIAL_TASK_LINE,
(SELECT CAST(ROUND(SUM(score),0) AS INT) score,TASK_LINE_ID
FROM (
SELECT AVG(CONVERT(decimal,score)) score,TASK_LINE_ID FROM dbo.special_assessment_score_detail WHERE TASK_ID=#{taskId} AND PROCESS_STATUS IN (‘4‘,‘5‘,‘0‘) GROUP BY SPECIAL_INDICATORS_ID,TASK_LINE_ID
)s GROUP BY TASK_LINE_ID) a
WHERE PO_SPECIAL_TASK_LINE.TASK_LINE_ID=a.TASK_LINE_ID
AND PO_SPECIAL_TASK_LINE.TASK_ID=#{taskId}

这是mybatis中XML中的代码,参数就是任务ID(taskId)

 












以上是关于sqlserver 关联表批量更新多行的主要内容,如果未能解决你的问题,请参考以下文章

mysql 表关联批量更新

SQL两表关联批量更新一列数据下面有数据参考

Oracle两张表关联批量更新其中一张表的数据

SQL Server 2008 update语句只能更新1行数据?

Oracle两张表关联批量更新其中一张表的数据

SQL使用之关联更新批量插入