【发布时间】:2013-05-09 10:39:57
【问题描述】:
我有一个表aps_sections,其中包含许多整数字段(例如bare_width 和worn_width)。我还有多个查找表(例如aps_bare_width 和aps_worn_width),其中包含一个 ID 列和一个 WEIGHTING 列。 ID 记录在aps_sections 表的上述列中。我需要对aps_sections 表中的列的加权求和(其中加权值来自查找表)。我已经使用下面的SELECT 语句成功地管理了这个。
SELECT aps_sections.ogc_fid,
( aps_bare_width.weighting
+ aps_worn_width.weighting
+ aps_gradient.weighting
+ aps_braiding.weighting
+ aps_pigeon.weighting
+ aps_depth.weighting
+ aps_standing_water.weighting
+ aps_running_water.weighting
+ aps_roughness.weighting
+ aps_surface.weighting
+ aps_dynamic.weighting
+ aps_ex_cond.weighting
+ aps_promotion.weighting
+ aps_level_of_use.weighting) AS calc
FROM row_access.aps_sections,
row_access.aps_bare_width,
row_access.aps_worn_width,
row_access.aps_gradient,
row_access.aps_braiding,
row_access.aps_pigeon,
row_access.aps_depth,
row_access.aps_standing_water,
row_access.aps_running_water,
row_access.aps_roughness,
row_access.aps_surface,
row_access.aps_dynamic,
row_access.aps_ex_cond,
row_access.aps_promotion,
row_access.aps_level_of_use
WHERE aps_bare_width.fid = aps_sections.bare_width
AND aps_worn_width.fid = aps_sections.worn_width
AND aps_gradient.fid = aps_sections.gradient
AND aps_braiding.fid = aps_sections.braiding
AND aps_pigeon.fid = aps_sections.pigeon
AND aps_depth.fid = aps_sections.depth
AND aps_standing_water.fid = aps_sections.standing_water
AND aps_running_water.fid = aps_sections.running_water
AND aps_roughness.fid = aps_sections.roughness
AND aps_surface.fid = aps_sections.surface
AND aps_dynamic.fid = aps_sections.dynamic
AND aps_ex_cond.fid = aps_sections.ex_cond
AND aps_promotion.fid = aps_sections.promotion
AND aps_level_of_use.fid = aps_sections.level_of_use
我现在需要做的是创建一个函数,将计算结果添加到aps_sections 表的physical_sn_priority 列。到目前为止,我的理解是我的函数应该类似于:
CREATE OR REPLACE FUNCTION row_access.aps_weightings()
RETURNS trigger AS
$BODY$
BEGIN
NEW.physical_sn_priority := ;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.update_km()
OWNER TO postgres;
但我不知道在NEW.physical_sn_priority := 后面放什么。我是 SQL 和 PostgreSQL 的初学者,因此我将不胜感激!
【问题讨论】:
-
很抱歉这些言论让大家厌烦了,但是像这样的问题需要声明 Postgres 的版本。它是哪一个?您还需要解释触发器的来源。您要更新单行、不同的行还是所有行?任何添加的列都可以为 NULL 还是都定义为
NOT NULL?是否保证参照完整性(所有这些关系上的外键)?以及所涉及列的数据类型是什么?
标签: sql function postgresql triggers mathematical-expressions