postgresSQL вставляет несколько строк, id возвращается из запросов select - PullRequest
0 голосов
/ 11 февраля 2019

У меня сложный запрос, который объединяет несколько таблиц и возвращает много идентификаторов элементов (строка 5)

Для каждого memberId я хочу вставить запись memberSegment, состоящую из memberId (нового для каждой вставки) исегментId (всегда один и тот же / не список)

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

Каждый отдельный запрос возвращает следующее:

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Например:

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;
0 голосов
/ 11 февраля 2019

Вы можете сформулировать это как 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 );

Это, по крайней мере, обойдет вашу текущую ошибку, которая возникает из запроса, возвращающего более одного идентификатора.Единственная возможная проблема будет, если подзапрос на db.segment также возвращает более одного значения.Если это не так, то выше должно работать.Если он возвращает более одного значения, то ваша логика должна быть пересмотрена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...