sql - 如何在我的插入中使用 WITH 表中的值?
问题描述
在最后一个答案之后,我意识到我做了一些不需要的事情。所以我尝试将其重写如下,但得到错误
CREATE OR REPLACE FUNCTION piljetter_system.update_search() RETURNS trigger AS $func_table$
BEGIN
INSERT INTO piljetter_system.search(consertid, document_tsvector)
SELECT new.consertid,
setweight(to_tsvector('english', coalesce(new.consertname, '')), 'A')
|| setweight(to_tsvector('english', coalesce(b.bandname , '')), 'B') -- Get bandname from id
|| setweight(to_tsvector('english', coalesce(s.stagename, '')), 'C') -- GET stagename from id
|| setweight(to_tsvector('english', coalesce(s.stagecountry, '')), 'D') -- GET stagecountry from id
|| setweight(to_tsvector('english', coalesce(s.stagecity, '')), 'E') -- GET stagecity from id
|| setweight(to_tsvector('english', coalesce(s.stagestreet, '')), 'F')
-- GET stagestreet from id
FROM piljetter_system.bands b, piljetter_system.stages s
WHERE b.bandid = new.bandid AND s.stageid = new.stageid;
RETURN NEW.document_tsvector;
END
$func_table$ LANGUAGE plpgsql;
我在我的 conserts 表中触发插入和更新功能。
我想要的结果是在 search(consertid, document_tsvector) 插入一个新行,其中 consertid = new.consertid 和 document_tsvector = new.consertname, bandname from the new.bandid in the consert stagename, stagecountry, stagecity, stagestreet from the new .stageid。
错误:
错误:FEL:无法识别的权重:69 上下文:SQL-sats:“插入到 piljetter_system.search(consertid, document_tsvector) SELECT new.consertid, setweight(to_tsvector('english', coalesce(new.consertname, '')), ' A') || setweight(to_tsvector('english', coalesce(b.bandname , '')), 'B') -- 从 id 获取乐队名 || setweight(to_tsvector('english', coalesce(s.stagename, '')), 'C') -- 从 id || setweight(to_tsvector('english', coalesce(s.stagecountry, '')), 'D') -- 从 id || setweight( to_tsvector('english', coalesce(s.stagecity, '')), 'E') -- GET stagecity from id || setweight(to_tsvector('english', coalesce(s.stagetreet, '')), 'F') -- 从 id FROM 获取 stagetreet
piljetter_system.bands b, piljetter_system.stages s WHERE b.bandid = new.bandid AND s.stageid = new.stageid" PL/pgSQL 功能 piljetter_system.update_search() rad 3 vid SQL-sats
// 旧帖子我对函数和触发器有点陌生,我正在学校做一个项目。我想创建一个触发器函数,根据我插入到我的 conserts 表中的内容更新另一个表。
我的问题是我需要来自 stageid 的 stagename、stagecountry、stagecity、stagestreet 以及来自 bandid 的乐队名并将其插入到搜索列 document_tsvector 中。您可以在下面看到我需要修复的代码。我无法从我插入的 WITH 表中获取信息。
CREATE FUNCTION piljetter_system.update_search() RETURNS trigger AS $func_table$
BEGIN
WITH band AS (
SELECT bandname FROM piljetter_system.bands WHERE bandid = new.bandid
), stage AS (
SELECT stagename, stagecountry, stagecity, stagestreet FROM piljetter_system.stages WHERE stageid = new.stageid
)
INSERT INTO piljetter_system.search(consertid, document_tsvector)
VALUES (new.consertid,
setweight(to_tsvector('english', coalesce(new.consertname, '')), 'A')
|| setweight(to_tsvector('english', coalesce(band.bandname , '')), 'B') -- Get bandname from id
|| setweight(to_tsvector('english', coalesce(stage.stagename, '')), 'C') -- GET stagename from id
|| setweight(to_tsvector('english', coalesce(stage.stagecountry, '')), 'D') -- GET stagecountry from id
|| setweight(to_tsvector('english', coalesce(stage.stagecity, '')), 'E') -- GET stagecity from id
|| setweight(to_tsvector('english', coalesce(stage.stagestreet, '')), 'F') -- GET stagestreet from id
);
RETURN NEW;
END
$func_table$ LANGUAGE plpgsql;
桌子的图片; 乐队
感谢您的任何帮助!
解决方案
你为什么用 WITH 做这件事?为什么不只运行两个查询,将值存储到变量中,然后在 INSERT 中使用变量?
无论如何,您只需从 CTE 表中进行选择。
INSERT INTO piljetter_system.search(consertid, document_tsvector)
select new.consertid, ...
from band, stage
但看起来您的触发器正在插入它刚刚调用的同一个表中。那是错的。如果您的目标是设置 document_tsvector,则应在 RETURN NEW 之前为 NEW.document_tsvector 分配一个值。
推荐阅读
- python - 如何将 3D RGB 标签图像(在语义分割中)转换为 2D 灰度图像,并且类索引从 0 开始?
- c# - c#.net 字符串到日期时间
- javascript - 单击chrome中打印的取消按钮后,HTML选择重置
- javascript - Typed.JS 清除完整的短语并使用打字功能开始新的短语
- reactjs - ReactJs 调用 api 后不生成数据进入视图
- c# - 如何一次生成多个报告
- azure - 如何使用 ARM 模板将 NSG 应用于现有子网
- r - 徽标/图像未在 shinyapps.io 上显示
- mongodb - 蒙古数据库。计算数组中的字段
- android - 按下按钮时,应用程序崩溃