如何将多个参考表数据组合到json?

时间:2019-03-08 07:16:58

标签: sql json postgresql

示例:https://rextester.com/CVYPI14438
我有四张桌子。
table1是用于映射表名和列的参考表。
Table0是串行表。
Tab77和roc99是原始数据表。

table0
    serial
1   a22
2   a33
3   a11


table1
    name    tablename   col
1   weight  tab77       e04
2   height  roc99       e09
3   tel     tab77       h04


tab77
    serial  e04 h04
1   a22     69  9998776
2   a33     50  6668676
3   a11     66  7328989
4   a44     66  7888989


roc99
        serial  e09
    1   a11     176
    2   a33     182
    3   a22     166
    4   a88     192

我要做出这样的结果。

    serial  raw
1   a22     {"tel": "9998776", "height": "166", "weight": "69"}
2   a33     {"tel": "6668676", "height": "182", "weight": "50"}
3   a11     {"tel": "7328989", "height": "176", "weight": "66"}

我不能一一键入表名和col。 是否可以仅使用sql自动获得此结果? 为什么表关系是这样设计的? 如何调用此表关系结构?

1 个答案:

答案 0 :(得分:0)

此代码将提供与您的结果等效的输出,

SELECT t1.serial,concat('{','"tel": "',max(h04),'", "height": "',max(e09),'", "weight": "',max(e04),'"}') as raw FROM 
tab77 t1
INNER JOIN roc99 t2 on t1.serial=t2.serial
group by t1.serial ;

您可以在这里尝试此动态查询,这里我将透视表并执行字符串agg,在数组中需要包含列列表。

SELECT serial,concat('{',string_agg(val,', '),'}') as raw
from
(select serial, concat('"',cat,'": "',val,'"') as val
from(select t1.serial,
unnest(array['tel', 'height', 'weight']) AS cat,
       unnest(array[h04, e09, e04]) AS val
 from tab77 t1
INNER JOIN roc99 t2 on t1.serial=t2.serial
order by t1.serial)a)b group by serial ;