在存储函数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命令而编写过程。这是一个重要的性能反模式-使用视图进行读取。您可以查看此查询吗。