Оператор INSERT SQL внутри оператора SELECT SQL в PostgreSQL - PullRequest
0 голосов
/ 07 сентября 2018

Может кто-нибудь сказать мне, почему это не работает?

select * 
from keyword_groups_list 
where group_id = (insert into keyword_groups_list(group_name, keyword_tool_id) 
                  values('title', 86574551) returning group_id);

Я получаю сообщение об ошибке в PostgreSQL:

ОШИБКА: синтаксическая ошибка в или около "в"
ЛИНИЯ 1: ... из списка ключевых слов_группы, где идентификатор_группы = (вставить в keywo ...

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы можете получить доступ к этому значению, если поместите его в CTE

Смотрите это SQL скрипка

with t as (
    insert into mytable (id, val) values(1,'abc') returning id
)
select * from anotherTable where id in (select id from t)

В документации Postgres INSERT есть и другой пример CTE, подобный этому. Поиск "Возвращение"

Или просто упростить до

insert into mytable (id, val) values(1,'abc') returning *
0 голосов
/ 07 сентября 2018

Я не понимаю, зачем вам вообще нужен выбор. Просто используйте returning *, чтобы получить все столбцы вновь вставленных строк:

insert into keyword_groups_list(group_name, keyword_tool_id) 
values ('title', 86574551) 
returning *;

Сказав это, вы можете сделать это с помощью CTE, если вам действительно нужен выбор:

with new_groups as (
    insert into keyword_groups_list(group_name, keyword_tool_id) 
    values ('title', 86574551) 
    returning group_id
)
select * 
from keyword_groups_list 
where group_id in (select group_id from new_groups);

Но я не могу придумать причину, чтобы предпочесть это простым returning *;

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