首页 > 解决方案 > 如何在我的插入中使用 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;

桌子的图片; 乐队

音乐会

阶段

搜索

感谢您的任何帮助!

标签: sqlpostgresqlsql-insertplpgsqlcommon-table-expression

解决方案


你为什么用 WITH 做这件事?为什么不只运行两个查询,将值存储到变量中,然后在 INSERT 中使用变量?

无论如何,您只需从 CTE 表中进行选择。

INSERT INTO piljetter_system.search(consertid, document_tsvector)
select new.consertid, ...
    from band, stage

但看起来您的触发器正在插入它刚刚调用的同一个表中。那是错的。如果您的目标是设置 document_tsvector,则应在 RETURN NEW 之前为 NEW.document_tsvector 分配一个值。


推荐阅读