多行的 SQL db2 更新查询

Posted

技术标签:

【中文标题】多行的 SQL db2 更新查询【英文标题】:SQL db2 update query for multiple rows 【发布时间】:2018-11-05 17:27:50 【问题描述】:

我正在通过以下查询更新记录:

update tableA set Quantity=
(select count(*) from table B where ID=x)
where ID=x

update tableA set Quantity=
(select sum(Stock) from table C where ID=y)
where ID=y 

示例(已更正):

tableA 中的所有 ID 都分为 2 个表:TableB 和 TableC。我必须用 TableB 的计数更新 TableA 的数量字段(如果 ID.TableA 在 TableB 中),并用 TableC 的 sun(stock) 更新 TableA 的数量字段(如果 ID.TableA 在 TableC 中)

有 500k 个 ID 需要像这样更新。我想知道如何在不必执行 500k 查询的情况下完成它。

编辑:我正在从 TableB 中获取行数,count 不是 TableB 的列。

任何帮助将不胜感激,TIA!

【问题讨论】:

如果ID既不在tableB也不在tableC中怎么办?使用空值、零、不更新、其他? 所有ID都在TableB或TableC中 【参考方案1】:

您的表和列的名称对我来说并不是 100% 清楚,所以我对它们进行了一些猜测。如果需要,请更正:

update tablea a set quantity = case
  when (select count(*) from tableb where b.id = a.id) is not null then
    (select count(*) from tableb b where b.id = a.id)
  else
    (select sum(stock) from tablec c where c.id = a.id)
  end

【讨论】:

您好,感谢您的回答! “select count(*) from tableB where b.id = a.id”将为我提供 B.id=A.id 的所有记录的计数。虽然我需要将 B.id=1 的计数更新为 A.id=1 的 quantity.TableA 并将 B.id=2 的计数更新为 A.id=2 的 quantity.TableA 等等。 请提供tableA、TableB和TableC的一些示例数据,以及预期的结果。几行将有很长的路要走。 更新了原帖中的图片。 select count(*) from tableB where b.id = a.id 将仅计算与 id 匹配的行。例如,对于 ID=1,它将找到三行并生成值 3。这是你想要的吗?对于 ID=2,它将找到两行并生成值 2【参考方案2】:
declare global temporary table tablea(id int not null, quantity int) with replace on commit preserve rows not logged;
declare global temporary table tableb(id int not null) with replace on commit preserve rows not logged;
declare global temporary table tablec(id int not null, stock int) with replace on commit preserve rows not logged;

insert into session.tablea values (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0);
insert into session.tableb values 1, 1, 1, 2, 2, 3;
insert into session.tablec values (4, 3), (5, 2), (5, 2), (5, 1), (6, 3), (6, 4);

update session.tableA a 
set Quantity=coalesce(
  nullif((select count(*)   from session.tableb b where b.ID=a.ID), 0)
, (select sum(stock) from session.tablec c where c.ID=a.ID)
);

select * from session.tableA;

【讨论】:

"select count() from tableB b where b.ID=a.ID" 给出了存在 A.ID 的 TableB 中所有计数 () 的总和。当 A.id 存在于 B 中时,我需要更新 TableA 中要更新的所有 A.id 的相应计数。如果您查看我在原始帖子中上传的图片,您的解决方案会将 1,2 和 3 的数量更新为 6而我需要 1,2 和 3 的数量分别为 3,2 和 1。 按原样运行修改后的示例并将结果与​​您的图像进行比较。 非常感谢您的努力,但这是在生产中。我没有创建新表/列的访问权限和权限。 然后在你的测试中试试这个。这只是为了表明更新语句可以按您的需要工作 - 您得到的结果与图片中提供的结果相同。顺便说一句,我只使用了全局临时表。所以,这里没有创建持久表。【参考方案3】:

您可以使用相关子查询:

update tableA
    set Quantity = (select count(*) from table B where B.ID = A.ID)

【讨论】:

"select count from table B where B.ID = A.ID" 这给出了 B.ID = A.ID 的所有字段的计数。它提供给我的计数是 600K。它将更新所有 Quantity = 600k。 “表 B 的计数”。计数 - 这是 TableB 的一列吗?或者你想要'select count(*) from tableb where ID=x'而不是'select count from tableb where ID=x'? 如果不清楚,很抱歉,count 不是一列。我正在获取 B.ID=x 的行数

以上是关于多行的 SQL db2 更新查询的主要内容,如果未能解决你的问题,请参考以下文章

DB2批量update问题

sql-内连接更新多行

如何使用 linq to sql 一次更新多行?

在 Sql Server 中插入或更新多行

如何使用linq to sql一次更新多行?

插入后使用触发器更新多行(sql server)