2017-01-08 4 views
0

Я пытаюсь создать объект JSON заклиненный на children.id колонки:Попытки ссылаться на неоднозначный столбец в подзапросе

SELECT 
    format('{%s}', 
    string_agg(
     format(
     '%s:%s', 
     to_json(children.id), 
     row_to_json(t) 
    ), ',' 
    ), '' 
)::json as json_object 
FROM (
    SELECT 
    children.id, 
    children.first_name, 
    children.last_name, 
    parents.id, 
    parents.first_name, 
    parents.last_name 
    FROM 
    children 
    LEFT OUTER JOIN 
    parents ON parents.id = children.parent_id 
    ORDER BY 
    LOWER(children.last_name), 
    LOWER(children.first_name) 
) t 

Каким будет возвращать результат, как

{ 
    "1": { 
    "id": "1", 
    "first_name": "Joe", 
    ... 
    } 
} 

Однако я получаю ошибка:

ERROR: missing FROM-clause entry for table "children" 
LINE 6:   to_json(children.id), 
        ^

Я не уверен, где поставить еще одну ссылку на «детей».

Я не хочу прибегать к наложению столбца id, например. children.id AS child_id потому что губит выход, т.е .:

{ 
    "1": { 
    "child_id": "1", <----- NO GOOD 
    "first_name": "Joe", 
    ... 
    } 
} 

это может быть сделано?

+0

Unrelated, но: почему вы не используете 'json_agg()' и 'json_build_object()' вместо вложенности формат '()' и 'string_agg()'? –

+0

@a_horse_with_no_name У меня еще нет опыта работы с функциями json. Будет ли это создавать ту же структуру и объект, на который вводится идентификатор каждой строки? – jemminger

ответ

0

Псевдоним children находится в подзапросе. У вас только есть доступ к t. Возможно, вы собираетесь:

SELECT format('{%s}', 
       string_agg(format('%s:%s', to_json(t.id), row_to_json(t) 
-------------------------------------------------^ 
           ), ',' 
         ), '' 
      )::json as json_object 
. . . 

В подзапроса, вы должны иметь уникальные имена:

SELECT children.id as child_id, 
     children.first_name as child_first_name, 
     children.last_name as child_last_name, 
     parents.id as parent_id, 
     parents.first_name as parent_first_name, 
     parents.last_name as parent_last_name 

Я на самом деле удивлен, Postgres не генерирует ошибку компиляции, так как многие другие базы данных будет, с дублировать имена столбцов в подзапросе.

+0

Да, я пробовал, но это говорит мне, что «t.id» неоднозначно. – jemminger

0

Выход подзапроса содержит 2 столбца с именем id. И 2 столбца по названию first_name и last_name. Переименуйте parents столбец таблицы и , тогда вы можете использовать t.id как to_json().

SELECT 
    format('{%s}', 
    string_agg(
     format(
     '%s:%s', 
     to_json(t.id), 
     row_to_json(t) 
    ), ',' 
    ), '' 
)::json as json_object 
FROM (
    SELECT 
    children.id, 
    children.first_name, 
    children.last_name, 
    parents.id AS parent_id, 
    parents.first_name AS parent_first_name, 
    parents.last_name AS parent_last_name 
    FROM 
    children 
    LEFT OUTER JOIN 
    parents ON parents.id = children.parent_id 
    ORDER BY 
    LOWER(children.last_name), 
    LOWER(children.first_name) 
) t 
Смежные вопросы