创建函数以更新 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 中的两个表的主要内容,如果未能解决你的问题,请参考以下文章

从两个表更新新创建的表 - SQL

SQL 创建触发器以在特定条件下更新表

更新触发器以将两个不同表中的数据添加到审计表中

SQL里怎么用UPDATE 更新大量SELECT 数据

创建 SQL 触发器以更新另一个表时出错

使用 PL/sql 函数进行 SQL 更新