在运行于AS400、6.1的DB2中进行SQL合并

托比·德鲁姆(Toby Derrum)

以下查询在As400上运行的DB2中不起作用。我已经读过类似的问题,但是不确定如何相应地修改查询。

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;
用户名

既然现在知道是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看起来像:

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子句进行条件设置。您希望确保仅更新“匹配”的行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

配置SQuirrel SQL Client以用于DB2 / AS400

来自分类Dev

配置SQuirrel SQL Client以用于DB2 / AS400

来自分类Dev

如何在Jboss 6 EAP上为as400 db2设置数据源?

来自分类Dev

在as400 db2中创建视图

来自分类Dev

AS400 RPGLE /运行中的自由动态变量

来自分类Dev

DB2 AS400和RPG请说明关系

来自分类Dev

找出正在运行RPG程序的JOBQ。AS400

来自分类Dev

找出正在运行RPG程序的JOBQ。AS400

来自分类Dev

在IBM i(AS400)DB2中导入/导出CSV

来自分类Dev

如何将此 AS400 查询转换为可以在连接 JDBC 的 DBMS 中运行的查询?

来自分类Dev

JayDeBe:将日期存储到 AS400/DB2(jt400 驱动程序)

来自分类Dev

SQL查询-db2 / 400 iseries

来自分类Dev

SQL查询-db2 / 400 iseries

来自分类Dev

实施Java存储过程IBM DB2 for i(AS400)

来自分类Dev

在as400上开发Java程序以从db2创建xml文件

来自分类Dev

jdbc 驱动程序连接到 db2 7.1 as400

来自分类Dev

如何使用 gradle 为 as400 db2 制作 springboot webservice?

来自分类Dev

修剪AS400中的空值

来自分类Dev

ERRMSG在AS400的DSPF中不显示

来自分类Dev

如何在AS400中创建UDF

来自分类Dev

如何从db2 / AS400文件系统中提取图像文件并将其插入MS SQL Server

来自分类Dev

如何在DB2中运行SQL并返回漂亮的XML

来自分类Dev

比较日期db2 / 400与SQL Server

来自分类Dev

可以在没有PRG的情况下通过VB.Net查询As400 DB2吗?

来自分类Dev

在 iSeries/AS400 上运行 jprofiler 的问题

来自分类Dev

DB2 / 400中的if-else语句

来自分类Dev

.NET中的DB2 / 400 TIMESTAMP字段操作

来自分类Dev

IBM i(AS400)从STRSQL调用SQL存储过程

来自分类Dev

AS400 嵌入式 SQL 游标处理