使用db2中另一个表的SUM更新表
我有两个文件FILE1和FILE2。文件1没有重复记录,但文件2有重复记录。文件2中重复的记录应汇总文件2中的数量字段2,汇总值应在文件1中更新 File1=itnum,qtyavl File2=itmnum,qtybln 在这里,我尝试过使用MERGE-INTO函数,它工作得很好,但我不想使用它,因为MERGE函数只能在ibmi的7.1版本中使用。 我想在不使用MERGE的情况下编写语句使用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
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匹配,则可能会减少总和。