创建函数以更新 SQL 中的两个表
Posted
技术标签:
【中文标题】创建函数以更新 SQL 中的两个表【英文标题】:Create function to update two tables in SQL 【发布时间】:2019-11-24 09:38:24 【问题描述】:我有两个表,有不同的列,我必须创建一个函数,当列年份与给定年份匹配时,用第一个表的信息更新第二个表,并将所有表分组到性别组中。
我在这里放了我的代码,但我不知道它是否可以,因为 pgAdmin4 由于 $$ 符号而返回错误,尽管我正在尝试解决它。
BEGIN WORK;
CREATE OR REPLACE FUNCTION update_report(p_year INTEGER)
RETURNS SETOF report1 AS $$
DECLARE report report1;
BEGIN
UPDATE report1 SET m.num=t_num, m.na=t_na, m.nd=t_nd, m.birth=t_birth
FROM report2 m
FULL JOIN report1
ON p_year= m.year
GROUP BY m.gender);
--In case there are any film in the specified year
IF NOT FOUND THEN
RAISE EXCEPTION ‘’%: No film exists in this year’’, -746;
END IF;
RETURN report;
END;
$$ LANGUAGE plpgsql;
COMMIT WORK;
有人可以告诉它是否可以吗?谢谢
【问题讨论】:
没有任何聚合的group by
绝对是错误的。然后你有一个流浪的)
。这是我可以看到的明显的语法错误
因为我之前声明了report1而创建了一个交叉连接?
【参考方案1】:
我不确定“按性别分组”是什么意思,但我认为您正在寻找一个简单的更新。
请注意,您应该不在 UPDATE 语句的 FROM 子句中重复目标表。
Quote from the manual
请注意,目标表不能出现在 from_list 中,除非您打算进行自联接
您没有向我们展示任何示例数据和预期结果或表格的结构,所以我只能猜测您到底想要什么,但可能是这样的:
UPDATE report1 r1
SET num = r2.t_num,
na = r2.t_na,
nd = r2.t_nd
birth = r.t_birth
FROM report2 r2
WHERE r1.year = r2.year
AND r1.gender = r2.gender
AND r1.year = p_year= m.year;
如果要返回所有已更改的行,则可以使用RETURNING
子句。你不需要declare
。使用 language sql
而不是 PL/pgSQL 可以让这更简单:
CREATE OR REPLACE FUNCTION update_report(p_year INTEGER)
RETURNS SETOF report1
AS $$
UPDATE report1 r1
SET num = r2.t_num,
na = r2.t_na,
nd = r2.t_nd
birth = r.t_birth
FROM report2 r2
WHERE r1.year = r2.year
AND r1.gender = r2.gender
AND r1.year = p_year= m.year
RETURNING r1.*; --<< return all modified rows
$$
LANGUAGE sql;
【讨论】:
以上是关于创建函数以更新 SQL 中的两个表的主要内容,如果未能解决你的问题,请参考以下文章