Json 试图引用子查询中的不明确列

Json 试图引用子查询中的不明确列,json,postgresql,subquery,Json,Postgresql,Subquery,我正在尝试构建一个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, child

我正在尝试构建一个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)别名为child\u id
),因为这会破坏输出,例如:

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

“child_id”:“1”,别名
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没有像许多其他数据库那样,在子查询中使用重复的列名生成编译错误。

子查询输出包含两列,分别命名为
id
,和两列 命名为
first\u name
last\u 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

是的,我试过了,但它告诉我't.id'不明确。不相关,但是:为什么不使用
json\u agg()
json\u build\u object()
而不是嵌套
format()
string\u agg()
?@a_-horse_和_-no_-name我对json功能还没有太多经验。这会产生相同的结构,并由每行的ID设置对象键吗?