【问题标题】:Update single-row table in pl/pgsql-while loop在 pl/pgsql-while 循环中更新单行表
【发布时间】:2021-12-07 12:49:01
【问题描述】:
create table data(a1 float, a2 float);
insert into data values(1::float, 1::float);

do $$
declare 
   counter integer := 0;
begin
   while counter < 50 loop
      --SAVE THIS INTO DATA      
      SELECT a1-0.1*random(),
              a2-0.1*random()
      from data group by a1, a;
      --SAVE THIS INTO DATA (END)
      counter := counter + 1;
   end loop;
end$$;

我想将a1a2 的值保存到第一个数据元组中。 (基本上是一个运行记录)

如何将SELECT 的结果保存到现有表中?

【问题讨论】:

    标签: sql postgresql plpgsql


    【解决方案1】:

    在桌子上加上PRIMARY KEY 会更容易:

    create table data(id int primary key, a1 float, a2 float);
    insert into data values(1, 1, 1);
    select * from data;
     id | a1 | a2 
    ----+----+----
      1 |  1 |  1
    
    update data set a1 = a1 - 0.1*random(), a2 = a2 - 0.1*random() where id =1;
    select * from data;
     id |         a1         |        a2        
    ----+--------------------+------------------
      1 | 0.9039355377682678 | 0.98859843416964
    
    

    然后将UPDATE 合并到计数器循环中:

    do $$              
    declare 
       counter integer := 0;
    begin
       while counter < 50 loop
          --SAVE THIS INTO DATA      
         update data set a1 = a1 - 0.1*random(), a2 = a2 - 0.1*random() where id =1;  
        --SAVE THIS INTO DATA (END)
          counter := counter + 1;
       end loop;
    end$$;
    
    select * from data;
     id |         a1          |         a2         
    ----+---------------------+--------------------
      1 | -1.3146675853588001 | -1.216530003992667
    
    

    【讨论】:

    • 谢谢你,我对 SQL 还是有点陌生​​,所以这是完美的解决方案。感谢您的快速答复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2013-02-22
    • 2012-09-13
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多