PostgreSQL的插入多行的ID从选择查询返回

问题描述 投票:0回答:2

我有一个复杂的查询连接多个表和返回许多成员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')
);

从阅读上,所以这是我如何理解它看起来应该,但我得到以下错误消息,让我觉得我的查询并不预期任何一个值的列表。

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

在其下自己的回报每一个查询:

enter image description here

postgresql bulkinsert
2个回答
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子查询也返回不是单个值更。如果没有的话,上面应该工作。如果它返回多于一个值,那么你的逻辑需要重新考虑。


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;
© www.soinside.com 2019 - 2024. All rights reserved.