在AS400上运行的DB2中的SQL合并,6.1

时间:2015-01-23 15:03:44

标签: sql merge db2 ibm-midrange

以下查询在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;

2 个答案:

答案 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。