Как использовать значения из таблицы WITH в моей вставке? - PullRequest
0 голосов
/ 15 февраля 2020

После последнего ответа я поняла, что делала ненужные вещи. Поэтому я попытался переписать его следующим образом, но получаю ошибку

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.

В результате я хочу вставить новая строка при поиске (consertid, document_tsvector), где consertid = new.consertid и document_tsvector = new.consertname, имя канала из new.bandid в stagename consert, stagecountry, stagecity, stagestreet из new.stageid.

ОШИБКА:

ОШИБКА: ЛСЭ: нераспознанный вес: 69 КОНТЕКСТ: SQL -sats: "INSERT INTO piljetter_system.search (consertid, document_tsvector) SELECT new.consertid, setweight (to_tsvector ('engli) sh ', coalesce (new.consertname,' ')),' A ') || setweight (to_tsvector (' engli sh ', coalesce (b.bandname,' ')),' B ') - Получить имя группы из идентификатора || setweight (to_tsvector ('engli sh', coalesce (s.stagename, '')), 'C') - GET stagename из идентификатора || setweight (to_tsvector ('engli * 1042) * ', coalesce (s.stagecountry,' ')),' D ') - GET stagecountry из id || setwei ght (to_tsvector ('engli sh', coalesce (s.stagecity, '')), 'E') - ПОЛУЧИТЬ stagecity от id || setweight (to_tsvector ('engli sh', coalesce (s.stagestreet, '')), 'F') - GET stagestreet с идентификатором FROM
piljetter_system.bands b, piljetter_system.stages s ГДЕ b.bandid = new.bandid AND s.stageid = new.stageid "PL / pg SQL -функция piljetter_system.update_search () rad 3 vid SQL -sats

// СТАРЫЙ ПОЧТА Я вроде новичок в функциях и триггерах, и я делаю проект в школе. Я хочу создать функцию триггера, которая обновит другую таблицу в зависимости от того, что я вставлю в свою таблицу conserts.

Моя проблема в том, что мне нужно stagename , stagecountry, stagecity, stagestreet из stageid, а также имя группы из 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;

Изображения таблиц; полосы

консервы

сцены

поиск

Спасибо за любые помощь!

1 Ответ

0 голосов
/ 15 февраля 2020

Почему вы делаете это с WITH? Почему бы просто не выполнить два запроса, хранящих значения в переменных, а затем использовать переменные в INSERT?

В любом случае, вы бы просто выбрали из таблиц CTE.

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

Но это выглядит как ваш триггер вставляет в ту же таблицу, к которой он только что был вызван. Это не правильно. Если ваша цель - установить document_tsvector, вам нужно просто присвоить значение NEW.document_tsvector, прежде чем вы вернетесь NEW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...