【问题标题】:Joining tables and creating a json out of the joined information加入表格并从加入的信息中创建一个 json
【发布时间】:2023-01-24 23:52:22
【问题描述】:

当一个表中的记录作为数组值放在另一个表的“新”列中时,有没有一种方法可以将 2 个表与一个查询连接到数据库?

(很清楚如何对两个表进行 2 个查询并在代码中处理结果,但是有没有办法只使用一个 SELECT 在查询“期间”连接表?)

所以,这是一个简单的例子:

表格1:

id value
1 v1
2 v2

表 2:

id id_t1 value
1 1 v3
2 1 v4
3 2 v5

作为从表 1 中选择所有值并与表 2 连接的查询结果,应该有下一个对象数组(为了使示例更通用,表 2 中的 id_t1 是从连接结果中过滤出来的):

[
  {
    id: 1,
    value: v1,
    newColumnForJoinedValuesFromTable2: [ { id: 1, value: v3 }, { id: 2, value: v4} ]
  },
  {
    id: 2,
    value: v2,
    newColumnForJoinedValuesFromTable2: [ { id: 3, value: v5 } ]
  }
]

【问题讨论】:

    标签: sql json postgresql join deno


    【解决方案1】:

    您可以通过堆叠以下函数两次来实现您的 json:

    • JSON_BUILD_OBJECT,给定 <key,value> 对来构建你的 jsons
    • JSON_AGG,聚合你的数组
    WITH tab2_agg AS (
        SELECT id_t1, 
               JSON_AGG(
                   JSON_BUILD_OBJECT('id'   , id_, 
                                     'value', value_)
               ) AS tab2_json
        FROM tab2
        GROUP BY id_t1
    )
    SELECT JSON_AGG(
               JSON_BUILD_OBJECT('id'                                ,       id_,
                                 'value'                             ,    value_,
                                 'newColumnForJoinedValuesFromTable2', tab2_json)
           ) AS your_json
    FROM       tab1
    INNER JOIN tab2_agg
            ON tab1.id_ = tab2_agg.id_t1
    

    查看演示 here

    【讨论】:

      【解决方案2】:

      使用 lateral joingroup by

      select json_agg(to_json(t)) from
      (                
       select t1.id, t1.value,
              json_agg(to_json(l)) as JoinedValues 
       from t1
       cross join lateral (select id, value from t2 where id_t1 = t1.id) as l
       group by t1.id, t1.value
      ) as t;
      

      demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 2012-06-15
        • 2017-07-07
        • 2020-11-10
        • 1970-01-01
        相关资源
        最近更新 更多