【问题标题】:unable to update DB2 table无法更新 DB2 表
【发布时间】:2017-10-12 09:41:34
【问题描述】:

您能帮我更新 DB2 表吗?有没有更好的方法来更新这个巨大的表?多谢。

UPDATE RT.ITEM  IM SET 
IM.ITEMNAME = GT.ITEM_D, IM.ITEMSIZE = GT.SIZE, IM.COLOR = GT.COL,
IM.ITEMINFO = GT.ITEM_I WHERE IM.RET = 14 AND IM.LAN = 10 and
  IM.ITEMK IN ( SELECT GT.SN_N FROM GD.G_TEMP GT );  

尝试从另一个模式表 (GD.G_TEMP) 更新表 (RT.ITEM) 并低于错误消息: [代码:-206,SQL 状态:42703] DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703,SQLERRMC=GT.ITEM_D

【问题讨论】:

    标签: sql db2 db2-luw


    【解决方案1】:

    您的代码不起作用。 DB2 在UPDATE 中不支持显式JOIN。但是您可以使用相关子查询做您想做的事:

    UPDATE RT.ITEM IM
        SET (ITEMNAME, ITEMSIZE, COLOR, ITEMINFO) = 
             (SELECT GT.ITEM_D, GT.SIZE, GT.COL, GT.ITEM_I
              FROM GD.G_TEMP GT
              WHERE GT.SN_N = IM.ITEMK
              FETCH FIRST 1 ROW ONLY
             )
        WHERE IM.RET = 14 AND IM.LAN = 10 AND
              EXISTS (SELECT 1
                      FROM GD.G_TEMP GT
                      WHERE GT.SN_N = IM.ITEMK
                     );
    

    【讨论】:

    • 感谢您的回复,但在执行时我又遇到了一个错误。你能帮我吗? [代码:-811,SQL 状态:21000] DB2 SQL 错误:SQLCODE=-811,SQLSTATE=21000,SQLERRMC=null。
    • 发生这种情况是因为子查询返回多行。您可以使用 fetch first 1 row only 修复错误,但这可能只是一种解决方法。
    【解决方案2】:

    您好,您可以尝试使用合并命令,如果 distinct 不能解决您在 gd_temp 表中的问题,其中单个 sn_n 值具有多行,那么您将不得不在子查询中添加更多过滤器。

    MERGE INTO RT.ITEM IM
    USING
      (SELECT DISTINCT
         GT.ITEM_D,
         GT.SIZE,
         GT.COL,
         GT.ITEM_I
       FROM GD.G_TEMP gt
    
      ) gt  on gt.sn_n=im.itemk AND IM.RET = 14 AND IM.LAN = 10
    WHEN MATCHED THEN UPDATE
    SET (im.ITEMNAME, im.ITEMSIZE, im.COLOR, im.ITEMINFO) = (GT.ITEM_D, GT.SIZE, GT.COL, GT.ITEM_I)
    

    【讨论】:

    • 感谢您的回复。在执行低于错误消息时。你能帮助我吗。错误消息:DB2 SQL 错误:SQLCODE=-134,SQLSTATE=42907,SQLERRMC=ITEM_I
    • 能否请您提供这两个表的 ddl 以及示例数据?此错误是关于字符串“导致 CLOB、DBCLOB、BLOB、LONG VARCHAR 或 LONG VARGRAPHIC 数据类型的表达式在:A SELECT DISTINCT 语句,按 .... 分组中是不允许的”。您必须添加额外的过滤器才能使每个 gt.sn_n 仅包含一行
    • 我忘记解释原因了。您必须添加额外的过滤器以使每个 gt.sn_n 只有一行,而无需使用 select distinct 或 group by
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多