我有一个复杂的查询,该查询连接多个表并返回许多成员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
每个查询本身都会返回以下内容:
答案 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;