我想先说我对 SQL 非常陌生,但我现在的工作需要我在其中工作。
我有一个包含地形点数据(x,y,z)的数据集。我正在尝试基于此数据构建 KNN 模型。对于每个点“P”,我在数据集中搜索最接近 P 的 100 个点(最近的意思是地理上最近的)。然后我平均这些点的值(这个平均值称为残差),并将这个值添加到“resid”列中的表中。
作为概念证明,我试图简单地遍历表,并将每行中“resid”列的值设置为 1.0。
我的查询是这样的:
CREATE OR REPLACE FUNCTION LoopThroughTable() RETURNS VOID AS '
DECLARE row table%rowtype;
BEGIN
FOR row in SELECT * FROM table LOOP
SET row.resid = 1.0;
END LOOP;
END
' LANGUAGE 'plpgsql';
SELECT LoopThroughTable() as output;
此代码成功执行并返回,但是当我检查表格时,没有进行任何更改。我的错误是什么?
原文由 Canadian_Marine 发布,翻译遵循 CC BY-SA 4.0 许可协议
在循环中逐行更新几乎总是一个坏主意,并且 会 非常慢并且不会扩展。你真的应该找到一种方法来避免这种情况。
说完之后:
您所做的所有功能就是更改内存中列值的值 - 您只是在修改变量的内容。如果要更新数据,则需要
update
语句:您需要在循环内使用
UPDATE
:请注意,您 必须 在
update
语句的主键上添加where
条件,否则您将更新循环的 每次 迭代的 所有 行。更 有效的解决方案是使用游标,然后使用
where current of
不,对函数的调用在调用事务的上下文中运行。因此,如果您在 SQL 客户端中禁用了自动提交,则在运行
SELECT LoopThroughTable()
commit
。请注意,语言名称是标识符,请勿在其周围使用单引号。您还应该避免使用像
row
这样的关键字作为变量名。使用 美元引用(正如我所做的那样)也使编写函数体更容易