使用 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)
我有两个文件 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)