【问题标题】:postgresSQL insert multiple rows, of id returned from select queriespostgresql 插入多行,从选择查询返回的 id
【发布时间】:2019-07-05 00:39:29
【问题描述】:

我有一个复杂的查询,它连接多个表并返回许多成员 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

每个查询都各自返回以下内容:

【问题讨论】:

    标签: postgresql bulkinsert


    【解决方案1】:

    您可以将其表述为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 上的子查询是否也返回多个值。如果没有,那么上述应该工作。如果它确实返回多个值,则需要重新考虑您的逻辑。

    【讨论】:

    • 谢谢。没有 segmentId 应该始终是一个值 - 会尝试这个
    【解决方案2】:

    例如:

    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;
    

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2014-05-05
      相关资源
      最近更新 更多