我想知道如何让我的功能更有效率。另外我认为update语句没有处理,因为它发生在与同一个表上的select语句相同的循环迭代中。我想知道如何编写这个函数以提高效率并实际工作。我在订单完成时在触发器中使用此功能。 提前谢谢。
select table1.sale_date
from sales table1 where
table1.sale_date in (
(select debt_date::date from debtors where debt_date between
debt_date::date - 3 and debt_date::date + 4);
答案 0 :(得分:1)
我认为整个过程可以简化为单个MERGE语句。不需要(嵌套)循环:
merge into voorraad v
using
(
select r5.product_product_id, r5.gewicht, v.restvoorraad, v.restvoorraad - r5.gewicht as result
from relation_6 r6
join relation_5 r5 on r5.recept_recept_id= r6.recept_id
join voorraad v on v.product_product_id = r5.product_product_id
where r6.dieet_id = p_dieet_id
) t ON (t.product_product_id = v.product_id)
when matched then update
set restvoorraad = t.result;
内部查询是为每个产品计算restvoorraad
的新值的逻辑。我不认为我得到了所有连接,但是如果你能编写一个正确计算它的SELECT查询,只需将其插入MERGE语句。
答案 1 :(得分:0)
通过使用没有游标和逐行处理的SQL语句,您将获得更好的性能。
答案 2 :(得分:0)
我相信这种合并是正确的,并且比游标更有效:
merge into voorraad v
using (select r5.* from relation_5 r5 inner join relation_6 r6 on (r6.recept_id = r5.recept_recept_id) where r6.dieet_id=p_dieet_id) r
on (r.product_product_id = v.product_product_id)
update set v.restvoorraad = v.restvoorraad_id - r.gewicht;