【问题标题】:Select and Update in Stored Functions Postgresql在存储函数 Postgresql 中选择和更新
【发布时间】:2018-11-19 12:49:41
【问题描述】:

我创建了一个用于获取数据的存储函数:

CREATE OR REPLACE FUNCTION sold_quantity()  
RETURNS TABLE(  
 invoiceid BIGINT,  
 itemid BIGINT,  
 sum_sold_quantity NUMERIC)  
AS $$  
BEGIN  
 RETURN QUERY SELECT  
 invoice_id as invoiceid, item_id as itemid, sum(sold_quantity) as  
 sum_sold_quantity  
 FROM  
 invoice_item  
 WHERE  
 status='sold'  
 GROUP BY  
 invoice_id, item_id;  
END; $$  

LANGUAGE 'plpgsql';  

如何存储这些数据并使用它来更新下表?

UPDATE invoice_item 
    SET sold_quantity = sum_sold_quantity 
where invoice_id=invoiceid 
  and item_id = itemid;

我们如何将这两个查询(选择和更新)合并到一个存储函数中并执行以获取具有上述三列的所有 500k 记录并批量更新(如 10 000 条记录)

【问题讨论】:

  • 不相关,但是:使用 PL/pgSQL 进行简单查询是多余的。使用language sql 函数会更高效
  • 请不要这样做——不要写程序只是为了包装 SELECT 命令。它是显着的性能反模式 - 使用视图 instread。

标签: sql sql-update plpgsql postgresql-9.5 stored-functions


【解决方案1】:

可以直接在UPDATE语句中使用该函数

UPDATE invoice_item ii
    SET sold_quantity = sq.sum_sold_quantity 
from sold_quantity() as sq
where ii.invoice_id = sq.invoiceid 
  and ii.item_id = sq.itemid;

对于仅 500.000 行,我根本不会费心进行任何批处理。只需在一条语句中更新所有行。

事实上你并不需要一个函数来开始:

UPDATE invoice_item ii
    SET sold_quantity = sq.sum_sold_quantity 
from (
  select invoice_id as invoiceid, item_id as itemid, sum(sold_quantity) as  sum_sold_quantity  
  FROM  invoice_item  
  WHERE status='sold'  
  GROUP BY  invoice_id, item_id;  
) as sq
where ii.invoice_id = sq.invoiceid 
  and ii.item_id = sq.itemid;

【讨论】:

猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多