大家都知道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. C# Process.Start()

    本文转自:http://webcache.googleusercontent.com/search?q=cache:v4Sh6GlfJPYJ:blog.csdn.net/czw2010/article ...

  2. swift3.0 屏幕截图并且保存到本地相册

    所要截取的对象 var bg_view: UIView! 截取并且保存的代码如下 UIGraphicsBeginImageContextWithOptions(bg_view.frame.size, ...

  3. Java restful web service 开发入门

    可用的框架有不少,我用的是jersey. 直接上代码,其实,如果你会web service 这个restful的就很好理解了,自己跑一遍就OK了 用到的类 User.java package demo ...

  4. 如何开发自己的搜索帝国之ES图形化Kibana安装与使用

    在如何开发自己的搜索帝国之Elasticsearch中已经介绍安装好了ES,下面就Kibana对ES的查询监控作介绍,就是常提到的大数据日志处理组件ELK里的K. 什么是Kibana?现引用园友的一段 ...

  5. 【原创】IE8升级到IE11控制台报错的解决方案

    公司win7 64位 英文版系统,刚从IE8升级到IE11,在我F12准备调试js的时候,竟然发现控制台报错了!天啦撸,顿时慌了有木有! 网上搜索了半天,解决方案如下: http://www.micr ...

  6. 前端到后台ThinkPHP开发整站(6)

    今天终于把整个后台管理系统弄好了,其实没什么难点,只是作为一个Thinphp学习的练手项目,这个项目,现在还只能算是做了一半,还有前台展示方面的功能没有完成.先过一遍后台的功能吧! 1.首页 2.菜单 ...

  7. Linq to Objects for Java 发布 1.0.1 版本

    现在 java 支持 linq 啦.比原生 stream api 更好用,功能更强大.现已发布 version 1.0.1 地址: https://github.com/timandy/linq. A ...

  8. Java入门——(5)Java API

      关键词:String类.StringBuffer类.System类.Math类.Random类.Date类.Calendar类.DateFormat类   API (Application Pro ...

  9. Go语言循环判断的使用~

    Go 语言条件语句 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结 ...

  10. Linux学习总结(十)—— Java开发环境搭建:JDK+Maven

    Java开发环境最基础的两个开源软件是JDK和Maven. JDK 到Oracle官网下载相对应的源码包,这里我选择的是:Linux x64系统的jdk-8u131-linux-x64.tar.gz. ...