postgres array_agg с отличным от json_build_object - PullRequest
0 голосов
/ 17 октября 2019
select 
  t1.id,
  array_agg(
    json_build_object('id', t2.id, 'status', t2.status)
  ) as statuses
from table1 t1
inner join table2 t2 on t1.id=t2.user_id   
inner join table3 t3 on t1.id=t3.user_id
group by t1.id

table1 
id  ,  user
1   ,  'A'
2   ,  'B'

table2
user_id  ,  status
1   ,  'P'
1   ,  'AP'

table3
user_id  ,  something
1   ,  'A12'
1   ,  'B1212'

таблица3 также отношение один-много в результате дублирования состояний, поступающих в array_agg, я пробовал с помощью array_agg (отличные от json_build_object ()) и array_agg (отличные от json_build_object ()), как мы можем предотвратить дублированиев этом случае ??

1 Ответ

0 голосов
/ 17 октября 2019

Просто отфильтруйте соответствующий статус как условие соединения (1):

select 
  t1.id,
  array_agg(
    json_build_object('id', t2.id, 'status', t2.status)
  ) as statuses
from table1 t1
inner join table2 t2 on t1.id=t2.user_id   
inner join table3 t3 on t1.id=t3.user_id 
   and t3.status = 'A12'                   -- 1.
group by t1.id

Кроме того, если вы хотите получить действительные массивы JSON, вам следует использовать json_agg() вместо array_agg():

select 
  t1.id,
  json_agg(
    json_build_object('id', t2.id, 'status', t2.status)
  ) as statuses
from table1 t1
inner join table2 t2 on t1.id=t2.user_id   
inner join table3 t3 on t1.id=t3.user_id 
   and t3.status = 'A12'               
group by t1.id
...