大家都知道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关联更新问题的更多相关文章

  1. 转 update关联更新在sqlserver和oracle中的实现

    sqlserver和oracle中实现update关联更新的语法不同,都可以通过inline view(内嵌视图)来实现,总的来说sqlserver更简单些. 测试例子如下: create table ...

  2. sqlserver update join 多关联更新

    由于程序bug,导致之前很多数据入库后信息不全,好在有基础信息表,可以通过基础信息表更新缺失字段信息 1.通过 inner join语法实现多关联更新 update a set a.name = b. ...

  3. 转载:性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项

    这段时间AX查询变得非常慢,每天都有很多锁. 最后发现是数据库统计信息需要更新. ----------------------------------------------------------- ...

  4. 性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项

    原文:性能优化--统计信息--SQLServer自动更新和自动创建统计信息选项 原文译自:http://www.mssqltips.com/sqlservertip/2766/sql-server-a ...

  5. 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明

    一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...

  6. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

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

    使用场景 某个字段数据异常,利用另外一张表同步修改该表异常字段的数据; 关联更新 UPDATE tableName1 AS t1 LEFT JOIN tableName12 AS t2 ON t1.x ...

  8. SQL中的关联更新和关联删除

    在SQL中,经常用到关联查询,比如select a.* from A a inner join B b on a.PId=b.FId where 条件,SQL中也支持类似的关联更新和关联删除. 关联更 ...

  9. MySQL 多表关联更新及删除

    目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一.      多表关联更新 问题 ...

随机推荐

  1. 8. leetcode 485. Max Consecutive Ones

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  2. Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

    关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列. 分布式架 ...

  3. 【机器学习笔记之三】CART 分类与回归树

    本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...

  4. HTML 超链接 表格

    1...超链接 <a href="网址" target="_blank"> 被点击的文字</a> 如果把 target 属性设置为&qu ...

  5. python学习===实现定时发送,方法一

    #比如每3秒打印一次helloworld:from threading import Timer def printHello(): print "Hello World" t = ...

  6. php中自动加载类_autoload()和spl_autoload_register()实例详解

    一._autoload 自动加载类:当我们实例化一个未定义的类时,就会触此函数.到了php7.1以后版本不支持此函数好像抛弃了 新建一个类文件名字自己随便去:news类在auto.php文件里面去实例 ...

  7. 剑指OFFER(百度笔试)——二叉树的子结构

    百度软件开发实习生笔试: 1.模拟短作业优先调度算法,计算平均等待时间,例如输入[0,2,4,8]表示四个作业分别是第0s到.第2s到.第4s到.第8s到.[2,1,6,3]表示四个作业的运行时间. ...

  8. 再学python类(终结篇)

    续写 初学python类,这几天吃坏东西了,拖着虚弱的身躯写的.有些乱请各位看官海涵. 声明:本人编程新手,还在学习中.所表述的东西都是基础语法之类的,分享我的学习笔记.还望多多指点,我一定虚心接受. ...

  9. [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示

    javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = ...

  10. DataSet 转 List

    public class OrderInfo { public OrderResult GetOrderInfoByOrderNum(List<string> orderNumList) ...