Выбор и обновление в сохраненных функциях Postgresql - PullRequest
0 голосов
/ 19 ноября 2018

Я создал хранимую функцию для извлечения данных:

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;

Как мы можем объединить эти дваЗапросы (выбор и обновление) в одной сохраненной функции и выполнение для извлечения всех 500 тыс. записей с тремя вышеупомянутыми столбцами и обновления пакета (например, 10 000 записей)

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать эту функцию непосредственно в операторе 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;
...