Выбор большего количества столбцов, чем необходимо для вставки, для использования в операторе RETURNING
Для иллюстрации вот несколько таблиц в Postgres 9.6:
people
id | name
----+------
1 | a
2 | b
3 | c
4 | d
groups
id | name
----+-------
10 | xxx
20 | yyy
30 | zzz
people_in_group
person_id | group_id
----------+-------
1 | 10
2 | 10
Я хотел бы вставить несколько значений в people_in_group и вернуть имена групп. У меня уже есть person_id (2). Следующее работает, но не возвращает имя.
INSERT INTO people_in_group(person_id, group_id)
SELECT '2' AS person_id, id as group_id FROM groups
WHERE name IN ('xxx', 'yyy', 'not there')
ON CONFLICT DO NOTHING
RETURNING *;
Если я добавлю name
к SELECT
оговорка, я получу INSERT has more expressions than target columns
, Есть ли способ иметь name
из таблицы групп, возвращенной мне (через RETURNING
пункт)? Я знаю, что передаю имена групп, но приведенный выше запрос не удастся вставить для "xxx" (дублирующий ключ) и "not there" (такой группы нет), поэтому он будет возвращать только "yyy". В идеале я хотел бы знать, почему INSERTs
не удалось, но я возьму то, что смогу получить.
1 ответ
Решение
with i as (
insert into people_in_group(person_id, group_id)
select '2' as person_id, id as group_id
from groups
where name in ('xxx', 'yyy', 'not there')
on conflict do nothing
returning *
)
select i.person_id, i.group_id, g.name
from i inner join groups g on g.id = i.group_id