【问题标题】:SQL merge on in DB2 running on AS400, 6.1在 AS400、6.1 上运行的 DB2 中的 SQL 合并
【发布时间】:2015-03-22 15:47:09
【问题描述】:

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

【问题讨论】:

  • 定义“不起作用”
  • @Siyual 我收到一条消息说错误:[SQL0104] 令牌合并无效。
  • 查看手册以了解您的 AS/400 版本是否支持 MERGE
  • @mustaccio AS/400 的版本是 7.1,它支持 MERGE。我猜这个问题确实与我发布的链接有关。
  • 我看不出 DB2 for z/OS 的限制与 IBM i 系统有什么关系。

标签: sql merge db2 ibm-midrange


【解决方案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 标准根本没有这样的东西。)

请注意,在这两个示例中,子选择都需要条件 UPDATE 语句本身的 WHERE 子句。您要确保只更新“匹配”的行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2012-12-11
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多