1

I have two tables, one is a table #1 contains user information, email, password, etc..

the other table #2 contains item information

when I do a insert into table #2, and then use the returning statement, to gather what was inserted (returning auto values as well as other information), I also need to return information from table #1.

(excuse the syntax)

example:

insert into table #1(item,user) values('this item','the user') 
returning *, select * from table 2 where table #1.user = table #2.user)

in other words, after the insert I need to return the values inserted, as well as the information about the user who inserted the data.

is this possible to do?

the only thing I came up with is using a whole bunch of subquery statements in the returning clause. there has to be a better way.

Erwin Brandstetter
  • 605,456
  • 145
  • 1,078
  • 1,228

2 Answers2

4

I suggest a data-modifying CTE (Postgres 9.1 or later):

WITH ins AS (
   INSERT INTO tbl1(item, usr)
   VALUES('this item', 'the user') 
   RETURNING usr
   )
SELECT t2.*
FROM   ins
JOIN   tbl2 t2 USING (usr)

Working with the column name usr instead of user, which is a reserved word.

Erwin Brandstetter
  • 605,456
  • 145
  • 1,078
  • 1,228
1

Use a subquery.

Simple demo: http://sqlfiddle.com/#!15/bcc0d/3

insert into table2( userid, some_column )
values( 2, 'some data' )
returning 
    userid, 
    some_column,
    ( SELECT username FROM table1
      WHERE table1.userid = table2.userid
     );
krokodilko
  • 35,300
  • 7
  • 55
  • 79