示例: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自动获得此结果? 为什么表关系是这样设计的? 如何调用此表关系结构?
答案 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 ;