postgresSQL insert multiple rows, of id returned from select queries

社会主义新天地 提交于 2019-12-25 04:06:28

问题


I have a complex query that join multiple tables and return many member ids (line 5)

For each memberId I want to insert a memberSegment record, consisting of the memberId (new for each insert) and a segmentId (always the same/not list)

INSERT INTO db."memberSegment"(
    "memberId",
    "segmentId")
VALUES (
    (select table."memberId" complex query returns many ids ),
    (SELECT id FROM db.segment where "idName" = 'due-for-360')
);

From reading on SO this is how I interpret it should look, but I am getting following error message, making me think that my query is not expecting a list in either values.

ERROR: more than one row returned by a subquery used as an expression SQL state: 21000

Each query on its' own returns following:


回答1:


You might be able to phrase this as an INSERT INTO ... SELECT:

INSERT INTO db."memberSegment" (memberId, segmentId)
SELECT
    memberId,
    (SELECT id FROM db.segment WHERE idName = 'due-for-360')
FROM table -- (complex query returns many ids );

This would at the very least get around your current error, which is stemming from the query returning more than one id. The only possible issue would be if the subquery on db.segment also returns more than a single value. If it does not, then the above should work. If it does return more than one value, then your logic needs to be reconsidered.




回答2:


For example:

CREATE OR REPLACE FUNCTION f_get(ikey text)
  returns integer
  AS
$func$
DECLARE 
  l_id integer;
BEGIN
  LOCK TABLE foo IN SHARE ROW EXCLUSIVE MODE;
  INSERT INTO foo (type)
  SELECT ikey
   WHERE NOT EXISTS (
     SELECT * FROM foo WHERE type=ikey
   )
   returning id into l_id; --< store the returned ID in local variable
   return l_id; --< return this variable
END
$func$ LANGUAGE plpgsql;


来源:https://stackoverflow.com/questions/54631914/postgressql-insert-multiple-rows-of-id-returned-from-select-queries

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!