在存储函数Postgresql中选择并更新

在存储函数Postgresql中选择并更新,sql,sql-update,plpgsql,postgresql-9.5,stored-functions,Sql,Sql Update,Plpgsql,Postgresql 9.5,Stored Functions,我创建了一个用于获取数据的存储函数: 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_quantit

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

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记录,并像10000条记录那样进行批处理更新

您可以在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;
对于仅仅50万行,我根本不需要做任何批处理。只需在一条语句中更新所有行

事实上,您并不真正需要一个函数来开始:

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;

不相关,但是:使用PL/pgSQL进行简单查询是过分的。使用语言sql函数会更有效请不要这样做-不要只为包装SELECT命令而编写过程。这是一个重要的性能反模式-使用视图进行读取。您可以查看此查询吗。