Как сгладить несколько значений строк в объединенную строку в postgres? - PullRequest
1 голос
/ 04 ноября 2019

У меня есть простой набор из трех таблиц. 2 таблицы «источника» и таблица «соединения», позволяющая установить связь «один ко многим».

У меня есть этот запрос:

          select data.mph1.data ->> 'name' as name, data.mph1.data ->> 'tags' as Tags, 
          data.mph2.data ->> 'School' as school from data.mph1 
          join data.mph1tomph2 on data.mph1tomph2.mph1 = data.mph1.id
          join data.mph2 on data.mph2.id = data.mph1tomph2.mph2

Вывод выглядит как:

            Name             Tags                                School
           "Steve Jones"    "["tag1", "tag2"]"                  "UMass"
           "Steve Jones"    "["tag1", "tag2"]"                  "Harvard"
           "Gary Summers"   "["java", "postgres", "flutter"]"   "Yale"
           "Gary Summers"   "["java", "postgres", "flutter"]"   "Harvard"
           "Gary Summers"   "["java", "postgres", "flutter"]"   "UMass"

То, что я ищу, это

            Name             Tags                               School
           "Steve Jones"    "["tag1", "tag2"]"                  "UMass", "Harvard"
           "Gary Summers"   "["java", "postgres", "flutter"]"   "Yale, Harvard, UMass"

Как бы я получил этот результат в одном запросе? Возможно ли это?

1 Ответ

0 голосов
/ 04 ноября 2019

Используйте функцию агрегирования string_agg()

select 
    data.mph1.data ->> 'name' as name, 
    data.mph1.data ->> 'tags' as tags, 
    string_agg(data.mph2.data ->> 'School', ', ') as school
from data.mph1 
join data.mph1tomph2 on data.mph1tomph2.mph1 = data.mph1.id
join data.mph2 on data.mph2.id = data.mph1tomph2.mph2
group by data.mph1.id  -- if id is a primary key
-- group by 1, 2       -- otherwise
...