2017-02-13 8 views
1

У меня есть таблица служб с тремя столбцами.Значения, разделенные запятой, со всеми строками из таблицы

служба

sr_id lang alias 
1  EN A 
1  PA B 
1  HI C 
2  EN D 
2  HI E 

Теперь я хочу, чтобы вывести с каждым идентификатором сервиса, языки и столбец псевдоним будет конкатенация псевдонима для службы.

Пример вывода -

SR_ID lang alias 
1  EN  A,B,C 
1  PA  A,B,C 
1  HI  A,B,C 
2  EN  D,E 
2  HI  D,E 

Как я могу сделать это с PostgreSQL 9.4?

ответ

1

Пробовал создавать аналогичные условия с одинаковыми данными образца. Пожалуйста, проверьте ниже запрос

select a.sr_id , a.lang, b.ALIAS from 
SERVICES a , 
(
select sr_id , string_agg(ALIAS::text,',') ALIAS 
from SERVICES 
group by sr_id) b 
where a.sr_id = b.sr_id; 
+3

Было бы лучше использовать явное JOIN а не старомодным (до 1992 года) неявным соединением: '... FROM Services A JOIN (SELECT ...) B ON A.Sr_ID = B.Sr_ID ...'. –

+0

Спасибо, за ваше предложение. Будет заботиться. – Tajinder

3

Если вы не должны их сортируют, вы можете использовать:

select sr_id, lang, string_agg(alias, ',') over() as alias 
from services 
order by sr_id; 

В противном случае вам нужно:

select s.sr_id, s.lang, t.alias 
from services s 
join (
    select sr_id, string_agg(alias, ',' order by alias) as alias 
    from services 
    group by sr_id 
) t on t.sr_id = s.sr_id 
order by s.sr_id; 
+0

Вы можете поместить внутренний подзапрос в CTE для удобочитаемости/производительности, но +1 в любом случае –

+0

@TimBiegeleisen: размещение группы по запросу в CTE не окажет никакого влияния на производительность –

 Смежные вопросы

  • Нет связанных вопросов^_^