使用db2中另一个表的SUM更新表

使用db2中另一个表的SUM更新表,db2,ibm-midrange,db2-400,Db2,Ibm Midrange,Db2 400,我有两个文件FILE1和FILE2。文件1没有重复记录,但文件2有重复记录。文件2中重复的记录应汇总文件2中的数量字段2,汇总值应在文件1中更新 File1=itnum,qtyavl File2=itmnum,qtybln 在这里,我尝试过使用MERGE-INTO函数,它工作得很好,但我不想使用它,因为MERGE函数只能在ibmi的7.1版本中使用。 我想在不使用MERGE的情况下编写语句 MERGE INTO file1 AS T

我有两个文件FILE1和FILE2。文件1没有重复记录,但文件2有重复记录。文件2中重复的记录应汇总文件2中的数量字段2,汇总值应在文件1中更新

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实际上也已经停止使用,目前只接受bug修复。但是:

update file1 t
  set qtyval = (select sum(qtybln) from file2 where itmnum = t.itnum)
  where itmnum in (select itmnum from file2)
在任何版本中都应该适用于您。请注意,update语句中的where子句只影响要更新的记录。除非qtyval可以包含null值,否则您只希望更新从文件2中选择sumqtybln的行,其中itmnum=t.itmnum将返回非null值。或者,您可以将子选择封装在合并中,并在子选择返回空值的地方指定一个值0

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

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)

这确实会更新文件中的每个记录,因为更新中没有where子句,只有子select。我更新了答案以避免更新匹配的行。我还格式化了您的sql语句以突出显示正在发生的事情。另一个问题是子选择排除了file2中的单个行,其中qtybln=qtyval。这可能不是任何行,除非该项只有一行,或者如果由于某种不愉快的巧合,qtyval的当前值与其中一行中的qtybln匹配,则可能会减少总和。