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;
我有一个连接多个表和 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;