1. 程式人生 > >sqlserver關聯更新問題

sqlserver關聯更新問題

rom date 所有 問題 目的 from myba lec cor

大家都知道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關聯更新問題