zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Y2K Accounting Bug(POJ 2586)
    Power of Cryptography(POJ 2109 math )
    codeforces C. Valera and Tubes
    codeforces C. Devu and Partitioning of the Array
    codeforces C. Ryouko's Memory Note
    codeforces C. k-Tree
    codeforces C. Prime Swaps
    codeforces C. Xor-tree
    codeforces B. Prison Transfer
    codeforces C. Sereja and Swaps
  • 原文地址:https://www.cnblogs.com/tangyonghui/p/7236236.html
Copyright © 2011-2022 走看看