2017-04-25 3 views
0

Pour illustrer, voici quelques tables à Postgres 9.6:Sélection plus de colonnes que nécessaire pour l'insertion pour une utilisation dans l'instruction RETOURNER

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 

Je voudrais insérer plusieurs valeurs dans people_in_group, et ont les noms de groupe sont retournés à moi. J'ai déjà le person_id (2). Les travaux suivants, mais ne renvoie pas le nom.

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 *; 

Si j'ajoute name à la clause SELECT, je vais INSERT has more expressions than target columns. Est-il possible d'avoir name à partir de la table de groupes retourné à moi (via la clause RETURNING)? Je sais que je passe dans les noms de groupe, mais la requête ci-dessus échouerait à insérer pour 'xxx' (clé en double), et 'pas là' (pas de tel groupe), donc il ne retournerait que 'yyy'. Idéalement, je voudrais savoir pourquoi certains INSERTs ont échoué, mais je vais prendre ce que je peux obtenir.

Répondre

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