使用 db2 中另一个 table 的 SUM 更新 Table

Update Table with SUM from another table in db2

我有两个文件 FILE1 和 FILE2。 File1 没有重复记录,但 file2 有重复记录。 file2 中重复的记录应求和 Quantity(file2 中的 field2),并且应在 File1 中更新求和值。

File1= itnum, qtyavl
File2= itmnum, qtybln

我在这里尝试使用 MERGE INTO 功能,它工作得很好,但我不想使用它,因为 MERGE 功能只能从 ibmi 的 7.1 版本使用。 我想在不使用 MERGE 的情况下编写语句。

MERGE INTO file1 AS T                                    
      USING (SELECT itmnum, sum(qtybln) AS balance          
     FROM file2 GROUP BY itmnum) AS S                    
        ON S.itmnum = T.itnum and qtyavl <> s.balance       
  WHEN MATCHED THEN UPDATE SET qtyavl = s.balance

既然7.1已经退役多年,要求v7.1也不是没有道理的。甚至 v7.2 也实际上已停止服务,目前仅接收错误修复。但是:

update file1 t
  set qtyval = (select sum(qtybln) from file2 where itmnum = t.itnum)
  where itmnum in (select itmnum from file2)

应该可以在任何版本中为您工作。请注意,更新语句中的 where 子句仅影响要更新的记录。除非 qtyval 可以包含空值,否则您只想将 select sum(qtybln) from file2 where itmnum = t.itmnum 将要 return 的行更新为非空值。或者您可以将 sub-select 包装在 coalesce() 中,并指定值 0,其中 sub-select return 为 null。

编辑:如果您只想更新需要更改 QTYVAL 的行,请使用此

update file1 t
  set qtyval = (select sum(qtybln) from file2 where itmnum = t.itnum)
  where itmnum in (select itmnum from file2)
    and qtyval <> (select sum(qtybln) from file2 where itmnum = t.itnum)

在 DB2 中,您不能将行过滤器(where 子句)与要插入的值组合在一个子句中。这会导致看似重复,但 SQL 优化器擅长重写 SQL 以提高性能。

以上语句运行良好,但我只想更新 summedup 值和 file1 值中不匹配的值。我尝试使用 coalesce,但它更新了文件 1 中的所有记录。

update file1 t                                          
set t.qtyavl = coalesce((select sum(s.qtybln)             
                           from file2 s                                           
                           where s.qtybln <> t.qtyavl 
                             and s.itmnum = t.itnum), 
                        t.qtyavl)