postgresQL 插入多行,从 select 查询返回的 id

postgresSQL insert multiple rows, of id returned from select queries

我有一个连接多个表和 return 许多成员 ID 的复杂查询(第 5 行)

我想为每个 memberId 插入一个 memberSegment 记录,包括 memberId(每次插入都是新的)和一个 segmentId(总是 same/not 列表)

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 这就是我解释它应该看起来的样子,但我收到以下错误消息,让我认为我的查询不期望任何一个值的列表。

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

每个查询单独 return 以下:

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

这至少可以绕过您当前的错误,该错误源于 return 多个 id 的查询。唯一可能的问题是 db.segment 上的子查询是否也 return 不止一个值。如果没有,那么上面的方法应该有效。如果它 return 不止一个值,那么你的逻辑需要重新考虑。

例如:

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;