получение нескольких данных для одного идентификатора в массиве в postgresql - PullRequest
0 голосов
/ 04 июня 2018

У меня 3 таблицы говорят tab1, tab2 and tab3.Теперь у tab1 есть уникальный ключ, скажем idKey.В tab2 есть несколько столбцов idKey, Ques.В tab3 есть столбцы idKey, Ans.здесь tab2 и tab3 имеют некоторые вопросы и ответы (где-то между 1 и 5), соответствующие idKey в tab1.пример данных:

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 голосов
/ 04 июня 2018

Создание таблицы:

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 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');

Запрос 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

Запрос 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...