我已经被困在这几个小时,我见过例子,但就是不能让这个工作。
我想对“BuiltResourceLines”表中的“总计”列求和,并将其放入“BuiltResources”表的总计中,其中“BuiltResourceLines”.“BuiltResourceId”=“BuiltResources”.“Id”
对于我的生活不能得到这个工作:
UPDATE dbo."BuiltResources" BR
SET "Total" = SUM(BRL."Total")
FROM dbo."BuiltResourceLines" BRL
WHERE BR."Id" = BRL."BuiltResourceId";
此函数返回“无法使用聚合...”
UPDATE dbo."BuiltResources" BR
SET "Total" =
(
SELECT SUM(BRL."Total")
FROM dbo."BuiltResourceLines" BRL
WHERE BRL."BuiltResourceId" = BR."Id"
)
WHERE BR."Id" = "HOW TO GET REFERENCE TO BRL HERE????;
这一个我不能得到参考BRL和我得到一个警告:不安全的查询:'Update'陈述式不含'where',一次更新所有数据表数据列
我试过大约50个其他的场景,但这些似乎最接近。
请帮帮忙。
以下是完整的触发器:
CREATE OR REPLACE FUNCTION update_builtresource_total()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS
$$
BEGIN
IF TG_OP = 'UPDATE' THEN
--QUERY
END IF;
RETURN NULL;
END
$$;
DROP TRIGGER IF EXISTS update_builtresource_total_trigger on dbo."BuiltResourceLines";
CREATE TRIGGER update_builtresource_total_trigger
AFTER UPDATE
ON dbo."BuiltResourceLines"
FOR EACH ROW
EXECUTE PROCEDURE update_builtresource_total();
1条答案
按热度按时间sqxo8psd1#
第二个查询不需要额外的
WHERE
,它已经返回了与内部表达式中当前行BR."Id"
相对应的和。一个
coalesce
可能会很有用,它可以防止在给定“Id”没有行时弹出空值。另外,第一个查询在两个表中的"Id"
上连接,第二个查询将"Id"
与"BuiltResourceId"
连接,这样更有意义。Updated demo:为了避免每次都更新整个表,您可以只将匹配
NEW
的行作为目标。