当前位置: 首页 > 知识库问答 >
问题:

对选择查询中的每一行进行操作

翁昊乾
2023-03-14

如何对SELECT中的每一行执行附加查询(UPDATE)?我必须从select中获取每一行的金额,并将其发送到用户的余额表。

示例:

status 0 - open
status 1 - processed
status 2 - closed

我的select语句:

select id, user_id, sell_amount, sell_currency_id
from (select id, user_id, sell_amount, sell_currency_id,
             sum(sell_amount) 
             over (order by buy_amount/sell_amount ASC, date_add ASC) as cumsell
      from market t
      where (status = 0 or status = 1) and type = 0
     ) t
where 0 <= cumsell and 7 > cumsell - sell_amount;

从市场表中选择结果

id;user_id;amount;status
4;1;1.00000000;0
6;2;2.60000000;0
5;3;2.00000000;0
7;4;4.00000000;0

我们得到7个金额并将其发送到用户余额表。

id;user_id;amount;status
4;1;0.00000000;2 -- took 1, sum 1, status changed to 2
6;2;0.00000000;2 -- took 2.6, sum=3.6, status changed to 2
5;3;0.00000000;2 -- took 2, sum 5.6, status changed to 2
7;4;2.60000000;1 -- took 1.4, sum 7.0, status changed to 1 (because there left 2.6 to close)

用户的余额表

user_id;balance
5;7 -- added 7 from previous operation

Postgres版本9.3

共有1个答案

慕容星晖
2023-03-14

总的原则是使用<代码>更新...FROM通过子查询。您的示例太难了,无法转化为有用的< code>CREATE TABLE和< code>SELECT语句,因此我创建了一个快速虚拟数据集:

CREATE TABLE balances (user_id integer, balance numeric);
INSERT INTO balances (user_id, balance) VALUES (1,0), (2, 2.1), (3, 99);
CREATE TABLE transactions (user_id integer, amount numeric, applied boolean default 'f');
INSERT INTO transactions (user_id, amount) VALUES (1, 22), (1, 10), (2, -10), (4, 1000000);

如果您想将交易应用于余额,您可以执行以下操作:

   BEGIN;

   LOCK TABLE balances IN EXCLUSIVE MODE;
   LOCK TABLE transactions IN EXCLUSIVE MODE;

   UPDATE balances SET balance = balance + t.amount 
   FROM (
      SELECT t2.user_id, sum(t2.amount) AS amount 
      FROM transactions t2 
      GROUP BY t2.user_id
   ) t 
   WHERE balances.user_id = t.user_id;

   UPDATE transactions
   SET applied = true
   FROM balances b
   WHERE transactions.user_id = b.user_id;

< code>LOCK语句对于并发插入/更新的正确性非常重要。

第二个更新将事务标记为已应用;您的设计中可能不需要这样的东西。

 类似资料:
  • 问题内容: 我有这个SQL查询: 这将导致类似于以下的输出: 我想每个Foo仅保留第一行,而忽略其余的行。 我怎么做? 问题答案:

  • 问题内容: 好的,我知道这已经得到了回答(使用Ajax或JavaScript选择下拉列表选项后,在同一页面上执行PHP脚本),但是对于以前从未使用过AJAX的人来说,答案并不是很有帮助。如果有人从下拉列表中选择一个选项,如何运行类似创建的查询? 问题答案: 首先,您必须使用Javascript触发AJAX请求。但是,我将通过使用jQuery(一个Javascript库)指导您。 您的HTML: 之

  • 如何构建查询来实现这一点?

  • 问题内容: 我想使用Python比较列表中的每个可能的对。 假设我有 我想对列表中2个元素的每个组合进行操作(我们称其为foo)。 最终结果应与 我的第一个想法是手动遍历列表两次,但这似乎不是很Python。 问题答案: 在模块中签出。它完全符合您的描述。 这等效于: 编辑: 有两个非常相似的功能,以及,和。为了说明它们之间的区别: 生成所有可能的元素对,包括所有重复项: 生成每个唯一元素对的所有

  • HQL是否可以对另一个查询的结果集进行选择?例如: 我可以在SQL中完成,但当我在HQL中尝试上述操作时,它只显示了语法错误“意外标记:(靠近第1行,第22列…”

  • 本文向大家介绍MySQL查询以使用AND OR进行选择,包括了MySQL查询以使用AND OR进行选择的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是使用AND OR执行选择的查询- 这将产生以下输出-