如何在 db2 中使用 join 进行更新

Posted

技术标签:

【中文标题】如何在 db2 中使用 join 进行更新【英文标题】:How to update in db2 with join 【发布时间】:2017-01-19 16:01:54 【问题描述】:

我想做一个更新,只更新受影响的值,但我的更新查询有一个连接,所以where exists 不起作用。

update semester_workload tA
set tA.account = (SELECT DISTINCT (t2.WORKING - t2.WORKLOAD) FROM SEMESTER_WORKLOAD t1
        join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
        WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW);
where exists (SELECT 1 FROM SEMESTER_WORKLOAD t1        
        join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
        WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW);

此代码不起作用,因为它显然无法识别 join 子句后的 where exists

【问题讨论】:

不相关,但是:distinct 不是一个函数。括号没用 【参考方案1】:

只是一个简单的语法错误。 where exists 子句之前有一个多余的分号:

update semester_workload tA
set tA.account = (SELECT DISTINCT (t2.WORKING - t2.WORKLOAD) FROM SEMESTER_WORKLOAD t1
        join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
        WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW) -- ; remove this
where exists (SELECT 1 FROM SEMESTER_WORKLOAD t1        
        join SEMESTER_WORKLOAD t2 on t1.ID_LECTURER = t2.ID_LECTURER
        WHERE t2.ACADEMIC_SEMESTER = 'WS10' AND tA.ID_SW = t2.ID_SW);

【讨论】:

【参考方案2】:

你有一个“;”过量。请注意,您不需要加入同一个表三次,您可以这样做:

UPDATE SEMESTER_WORKLOAD t1
set t1.account = 
(
   SELECT t2.WORKING - t2.WORKLOAD FROM SEMESTER_WORKLOAD t2
   WHERE 
   (t1.ID_LECTURER, t1.ID_SW, 'WS10')=(t2.ID_LECTURER, t2.ID_SW, t2.ACADEMIC_SEMESTER) 
   FETCH FIRST ROWS ONLY
)
where exists 
(
   SELECT * FROM SEMESTER_WORKLOAD t2
   WHERE 
   (t1.ID_LECTURER, t1.ID_SW, 'WS10')=(t2.ID_LECTURER, t2.ID_SW, t2.ACADEMIC_SEMESTER) 
)

【讨论】:

以上是关于如何在 db2 中使用 join 进行更新的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 db2 服务器中最近更新的表?

如何在 DB2 的单个更新语句中更新多个列

如何使用 DB2 中表的列值更新 DB1 中表的列值?

如何在 db2 中进行 AUTO_INCREMENT?

如何使用连接更新DB2表?

如何从安装在 DB2 中的 Java UDF 进行日志记录