如何在 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 进行更新的主要内容,如果未能解决你的问题,请参考以下文章