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

SQL merge on in DB2 running on AS400, 6.1

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

抱歉,系统实际上是运行 OS 6.1,不支持MERGE。

因为现在已知是 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 将始终从 table S490JR 接收 (1) 值,因此可以将其作为常量提供。唯一的要求是在 S490JR 中正确匹配的行应该 'exist'。

涵盖此处不需要的条件的更一般更新可能如下所示:

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 条件的可能性。 (我们不知道你的 table 中的每一行包含什么。) SET 子句的子 select 的结果集只能包含一行。只有一个值可以放入 SET 列。 MAX() 函数确保单个值,即使该值可能位于多个匹配行中。 MIN() 函数也可以用来代替 MAX()。 (我希望 SQL 有类似于 ANY() 函数的东西,但是用于 6.1 的 SQL 标准根本没有这样的东西。)

请注意,在两个示例中,subselect 都需要对 UPDATE 语句本身的 WHERE 子句进行条件化。您希望确保仅更新 "matching" 行。