在postgresql中获取数组中一个Id的多个数据

时间:2018-06-04 11:55:48

标签: json postgresql

我有3个表tab1, tab2 and tab3。 现在tab1有一些独特的密钥idKey。 tab2有一些列idKey, Ques。 tab3有列idKey, Ans。 这里tab2和tab3有一些问题和答案(1到5之间)对应于tab1中的idKey。 示例数据:

tab1:
idKey:
1
2
tab2:
idkey Ques
1 q11
1 q12
2 q21
2 q22
2 q23
tab3:
idKey Ans
1 a11
1 a12
2 a21
2 a22
2 a23

现在我想获取所有数据,这样在获取时,我将只返回2行,包括idKey,array(Ques),array(Ans)。 像这样的东西:

select a.idKey,array_agg(b.Ques),array_agg(c.Ans) from tab1 a, tab2 b, tab 3

必需的输出:

idKey Ques Ans
1 [q11,q12] [a11,a12]
2 [q21,q22,q23] [a21,a22,a23]

现在我想在json中使用这个问题数据 类似的东西:

select idKey,array_agg(row_to_json(Ques, Ans)) as QuesAns from tab1, tab2, tab3.

这样我就可以得到输出:

idKey QuesAns
1 [{"Ques":"q11", "Ans":"a11"},{"Ques":"q12","Ans":"a12"}]
2 [{"Ques":"q21", "Ans":"a21"},{"Ques":"q22", "Ans":"a22"},{"Ques":"q23", "Ans":"a23"}]

我该怎么做?

修改

我忘了添加一个序列。所以tab2和tab3还有另一列用于序列说seq,值为:

tab2:
    idkey seq Ques
    1 1 q11
    1 2 q12
    2 1 q21
    2 2 q22
    2 3 q23
    tab3:
    idKey seq Ans
    1 1 a11
    1 2 a12
    2 1 a21
    2 2 a22
    2 3 a23

所以现在查询应该是:

select idKey,array_agg(row_to_json(Ques, Ans)) as QuesAns from tab1 a, tab2 b, tab3 c where b.seq=c.seq

预期输出与上述相同。

1 个答案:

答案 0 :(得分:0)

Table Creation:

create table tab1(idkey int);
create table tab2(idkey int,seq int, ques char(10));
create table tab3(idkey int,seq int, ans char(10));

Insert Statement:

insert into tab1 values(1),(2);
insert into tab2 values(1,1,'q11'),(1,2,'q12'),
(2,1,'q21'),(2,2,'q22'),(2,3,'q23');
insert into tab3 values(1,1,'a11'),(1,2,'a12'),
(2,1,'a21'),(2,2,'a22'),(2,3,'a23');

Query 1:

select tab2.idkey,
array_agg((select row_to_json(_) from (select tab2.ques as "Ques", tab3.ans as "Ans") as _)) as value
from tab2 join tab3 on tab2.idkey = tab3.idkey 
and tab2.seq = tab3.seq
group by tab2.idkey

Query 2:

select tab2.idkey, 
array_agg(json_build_object('Ques',ques, 'Ans',ans)) as value
from tab2 join tab3 on tab2.idkey = tab3.idkey 
and tab2.seq = tab3.seq
group by tab2.idkey 

SQLFiddle