sql - 创建函数以更新 SQL 中的两个表
问题描述
我有两个表,有不同的列,我必须创建一个函数来更新第二个表,当列年份与给定年份匹配时,使用第一个表的信息并将所有表分组到性别组中。
在这里我放了我的代码,但我不知道它是否可以,因为 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;
有人可以告诉它是否可以吗?谢谢
解决方案
我不确定“按性别分组”应该是什么意思,但我认为您正在寻找一个简单的更新。
请注意,您不应在UPDATE 语句的 FROM 子句中重复目标表。
注意,目标表不能出现在 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;
推荐阅读
- javascript - DvaJS - 将保存的状态从 localStorage 加载到状态中
- c - MPI - 将随机整数发送到根进程时出错
- parallel-processing - Julia 并行性:@distributed (+) 比串行慢?
- angular - 订阅路由守卫中的 observables 及其含义
- javascript - 倒计时答题器 - JS
- python-3.x - Cassandra 3.11.3 and cqlsh not support python 3.6 and 3.7?
- websocket - ServerEnpoint change port
- vue.js - Vuejs v-on click 在组件内不起作用
- c# - 从字符串列表中删除空条目
- python - Python - Tkinter - 从角落调整窗口大小时滚动条自动移动