Выбор большего количества столбцов, чем необходимо для вставки, для использования в операторе 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
Другие вопросы по тегам