2017-04-25 12 views
0

, sind 9.6 einige Tabellen in Postgres hier Zur Veranschaulichung:für mehr Spalten als notwendig für Einsatz Auswahl in Anweisung RÜCKKEHR

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 

Ich möchte mehrere Werte in people_in_group einzufügen, und haben die Gruppennamen zurück mich. Ich habe bereits die person_id (2). Folgendes funktioniert, gibt aber den Namen nicht zurück.

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

Wenn ich name zum SELECT Klausel hinzufügen, ich werde INSERT has more expressions than target columns bekommen. Gibt es eine Möglichkeit name aus der mir zurückgegebenen Gruppentabelle (über die RETURNING Klausel) zu haben? Ich weiß, dass ich die Gruppennamen übergebe, aber die obige Abfrage würde nicht für 'xxx' (duplicate key) und 'not there' (keine solche Gruppe) einfügen, so würde es nur 'yyy' zurückgeben. Idealerweise würde ich gerne wissen wollen, warum bestimmte INSERTs gescheitert sind, aber ich nehme was ich bekommen kann.

Antwort

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 
Verwandte Themen