以下查询在As400上运行的DB2中不起作用。我读过类似的issues,但我不确定如何相应地修改我的查询。
merge into AB27PR AB
using (select USER, ROCOMP,REFID, QREADSTAT
from S490JR
where QREADSTAT =1) SR
on
(AB.USER= SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID )
when matched
and AB.XREADSTAT = 0
then update set XREADSTAT = SR.QREADSTAT;
答案 0 :(得分:1)
由于它现在已知为6.1,因此我们知道MERGE不合适并且可以使用直接UPDATE。最简单的可能是:
update AB27PR AB
set AB.XREADSTAT = 1
where AB.XREADSTAT = 0
and exists( select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
由于AB.XREADSTAT将始终从表S490JR接收(1)值,因此可以将其作为常量提供。唯一的要求是应该存在一个匹配正确的行'在S490JR。
更广泛的更新,涵盖了此处不需要的条件,如下所示:
update AB27PR AB
set AB.XREADSTAT = ( select max( SR.QREADSTAT )
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
where AB.XREADSTAT = 0
and exists( select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
在这种情况下,它会提取SR.QREADSTAT中的任何值。当然,由于WHERE子句将值限制为(1),它仍然是SET子句唯一可能的结果。
此外,使用MAX()函数是为了处理S490JR中可能有多行满足WHERE条件的可能性。 (我们不知道表中的每一行包含什么。)SET子句的子选择的结果集只能包含一行。只有一个值可以适合SET列。 MAX()函数确保单个值,即使该值可能在多个匹配的行中。 MIN()函数也可用于代替MAX()。 (我喜欢SQL有类似ANY()函数的东西,但用于6.1的SQL标准根本没有这样的东西。)
请注意,在两个示例中,subselect都需要调整UPDATE语句本身的WHERE子句。您希望确保仅更新"匹配"行。
答案 1 :(得分:0)
我很抱歉,系统实际上运行的是OS 6.1,它不支持MERGE。