postgresSQL插入多行,从选择查询返回的id

时间:2019-02-11 13:44:03

标签: postgresql bulkinsert

我有一个复杂的查询,该查询连接多个表并返回许多成员ID(第5行)

对于每个memberId,我要插入一个memberSegment记录,该记录由memberId(每次插入都为新的)和segmentId(始终相同/不是列表)组成

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')
);

从SO的阅读来看,这就是我的解释,但是我收到以下错误消息,使我认为我的查询不希望包含任何一个值列表。

  

错误:由子查询返回的多于一行用作表达式   SQL状态:21000

每个查询本身都会返回以下内容:

enter image description here

2 个答案:

答案 0 :(得分:0)

您也许可以将其表达为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 );

这至少会解决您当前的错误,该错误源于查询返回多个ID。唯一可能的问题是,db.segment上的子查询是否还返回了多个值。如果不行,则上面的方法应该起作用。如果确实返回多个值,则需要重新考虑您的逻辑。

答案 1 :(得分:0)

例如:

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;