【发布时间】:2016-09-17 03:48:13
【问题描述】:
我在 postgresql 中编写了一个函数,用于使用两个游标更新表,代码执行良好,没有错误,但不执行任何操作。
我有三张桌子
- 产品大师
- 销售数据表
- 目标表
所以在下面的函数中,我从 1 获取产品密钥,然后在销售表中计算产品已售出的商店/网点数量,然后相应地更新第三个表,
我需要每周计算每种产品的门店数量。但它们应该是唯一的,例如如果产品在第一周在奥特莱斯 A 和 B 销售,那么第一周的商店数量应该是 2,如果它在下周在 B、C、D 销售,那么第二周的总数应该是 4周,如果它在第三周在 A 和 D 销售,那么第三周的总数应该仍然是 4。我该怎么做。
任何帮助将不胜感激。
create or replace function StCount() returns void as
$BODY$
Declare
ik1 integer ;
wk1 integer ;
Cur1 CURSOR FOR SELECT ik From table1 ;
Cur2 CURSOR FOR SELECT distinct(wk) FROM table2 order by wk asc;
begin
OPEN Cur1 ;
WHILE (Found) Loop
FETCH next from Cur1 INTO ik1 ;
OPEN Cur2 ;
WHILE (Found) Loop
FETCH next from Cur2 INTO wk1;
update table3 set skly =(select count(sk)from table2 a
where a.ik = ik1 and a.wk = wk1
and a.sk not in (select distinct (sk) from table2
where ik = ik1 and wk <= wk1 - 1 ))
where ik = ik1 and wk = w1
;
End loop ;
CLOSE Cur2;
end loop ;
CLOSE Cur1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
【问题讨论】:
-
你为什么首先使用游标,这可以通过单个更新语句更有效地完成(并且
distinct是 NOT 一个函数) -
我只是选择不同的值来比较新的数字,你在哪里看到我已经将 distinct 定义为一个函数?
-
我正在使用游标,因为我每次都要扫描整个表来计算我需要的值,我不确定单个更新将如何完成该操作
-
distinct(wk)- distinct 不是函数。这与distinct wk相同。 distinct 始终对选择列表中的所有列进行操作。将选择列表的列放在括号中是没有用的,如果它是单列并且对于多列是完全错误的(另外:子查询中的distinct无论如何都是无用的) -
请edit您的问题并添加相关表的定义、一些示例数据以及更新后的预期输出。我确信这可以在没有高效和缓慢的光标循环的情况下完成。
标签: sql postgresql