2016-03-18 10 views
0

Я пытаюсь выполнить следующий запрос:ОШИБКА: подзапрос должен возвращать только один столбец

INSERT 
INTO rooms(
    id, 
    name, 
    body, 
    parents, 
    tags, 
    createtime, 
    creator, 
    deletetime, 
    meta, 
    params, 
    terms, 
    updater, 
    updatetime, 
    counts, 
    identities) 
SELECT * 
FROM dblink ('dbname=oldsb', 
    'SELECT ' 
     '(SELECT newid FROM id_map WHERE oldid = entities.id) AS id, ' 
     'id AS name, ' 
     'description AS body, ' 
     'NULL AS parents, ' 
     'NULL AS tags, ' 
     'ROUND(EXTRACT(EPOCH FROM current_timestamp)*1000) AS createtime, ' 
     'NULL AS creator, ' 
     'ROUND(EXTRACT(EPOCH FROM deletetime)*1000) AS deletetime, ' 
     'json_build_object(''picture'', picture) AS meta, ' 
     'jsonb_object_agg(
      (SELECT * ' 
      'FROM jsonb_each(params) ' 
      'AS fields (name, value) ' 
      'WHERE name <> ''places'')) AS params, ' 
     'terms AS terms, ' 
     'NULL AS updater, ' 
     'EXTRACT(EPOCH FROM lAStseentime)*1000 AS updatetime, ' 
     'NULL AS counts, ' 
     'NULL AS identities ' 
    'FROM entities WHERE type=''room''') 
AS t(
    id uuid, 
    name text, 
    body text, 
    parents uuid[], 
    tags smallint[], 
    createtime bigint, 
    creator text, 
    deletetime bigint, 
    meta jsonb, 
    params jsonb, 
    terms tsvector, 
    updater text, 
    updatetime bigint, 
    counts jsonb, 
    identities text[]); 

, и я получаю следующее сообщение об ошибке:

Отработка Комнаты миграции Query ОШИБКА: подзапрос должен возвращать только один столбец КОНТЕКСТ: Ошибка при подключении dblink с именем «unnamed»: не удалось выполнить запрос. стол для обновления удостоверений в номерах.

Я не могу понять, где я ошибаюсь в запросе.

+1

Вам нужно заменить 'SELECT *' внутри 'jsonb_object_agg (' и выбрать только один столбец –

ответ

0

Один из ваших подзапросов возвращает несколько результатов. Вероятно, этот.

SELECT newid FROM id_map WHERE oldid = entities.id

Добавить LIMIT 1 в конец и повторите попытку. Фактически вы можете добавить LIMIT 1 в каждый подзапрос и посмотреть, помогает ли он.

+2

Ошибка состоит из нескольких _columns_ not rows –

0

Возможно ли, что jsonb_each (params) имеет более одного столбца?

jsonb_object_agg(
     (SELECT * ' 
     'FROM jsonb_each(params) ' 
     'AS fields (name, value) ' 
     'WHERE name <> ''places'')) AS params, 

Я не знаю, что jsonb_object_agg() делает, но я не думаю, что он предназначен для обработки ввода, который является таблицей. Обычно агрегированные функции объединяют один или несколько строк результатов в одно значение.

0

Да, это так. Проверьте this документацию для функции json_each. json_each И jsonb_each работают одинаково.