Сложение символьных полей

zhukov

Новичок
Сложение символьных полей

Здравствуйте.
Есть задача: таблица постгрес в которой, например такие данные:
id fld1 fld2 fld3
238 d c Петя
238 d c Вася
239 н п Иван
239 н п Степан

и так далее по образцу - много записей

Необходимо получить такой результат во вьювере:

id fld1 fld2 fld3
238 d c Петя, Вася
239 н п Иван, Степан

Пошел примерно таким путем
CREATE OR REPLACE VIEW "public"."pppp" (
tr_id,
fam)
AS
SELECT a.tr_id, (
SELECT (((a.fam)::text || ', '::text) || (b.fam)::text)
FROM peoples b
WHERE (a.tr_id = b.tr_id)
) AS fam
FROM peoples a;

Так неработает - пишет эрор.

Спасибо зараннее...
 

phprus

Moderator
Команда форума
а если что-то типа:
Код:
SELECT p.id, p.fld1, p.fld2, ((p.fam)::text || ', '::text || (b.fam)::text) as fld3
FROM peoples p
JOIN  peoples b ON (p.id = b.id)
Писал не тестируя и по памяти, так что могут быть ошибки.

Так неработает - пишет эрор.
Какой эррор то пишет?
 

zhukov

Новичок
Спасибо за ответ
Эрор выглядит так ERROR: more than one row returned by a subquery used as an expression

Ваш варинт не то, что требуется, тк возвращает 4 строки

id fld1 fld2 fld3
238 d c Петя, Петя
238 d c Петя, Вася
238 d c Вася, Петя
238 d c Вася, Вася

А мне нужно одну, одно айди - одна запись...
 

phprus

Moderator
Команда форума
ERROR: more than one row returned by a subquery used as an expression
Переводить пробовал?

Да действительно не подумал про повторяемость в варианте с join.
Попробуй примерно такое:
Код:
SELECT DISTINCT p.id, p.fld1, p.fld2, array_to_string(ARRAY(
   SELECT p2.fld3 FROM peoples p2 where p2.id = p.id
), ', ')
FROM peoples p
Ну или вместо DISTINCT можно попробовать group by. Я не знаю что тут будет правильнее и логичнее использовать.

http://www.postgresql.org/docs/8.3/interactive/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS
http://www.postgresql.org/docs/8.3/interactive/functions-array.html
 

zhukov

Новичок
Переводить пробовал?
Конечно - более чем одна строка, возвращенная подзапросом, используемым как выражение....


Большое спасибо, в таком варианте все работает прекрасно.
DISTINCT необходимо использовать чтобы небыло дубляжей.
Еще раз спасибо (хотя оно не булькает).
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Я бы ещё предложил поискать в интернетах примеры агрегатных функций типа group_concat и array_accum. Возможно, с их использованием запрос будет быстрее работать, чем вариант с DISTINCT и подзапросом.
 

zhukov

Новичок
Народ, а можете ссылочки по этой теме написать, относительно именно Постгресса...
Порылся я в инете много, включая официальные сайты, но толковее чем на этом форуме мне не помогли, а просвещаться надо...))
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: zhukov
Народ, а можете ссылочки по этой теме написать, относительно именно Постгресса...
Ссылочки по какой именно теме?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ну вот примеры создания собственных агрегатных функций для сложения символьных полей: http://mssql-to-postgresql.blogspot.com/2007/12/cool-groupconcat.html, http://devtime.blogspot.com/2007/04/porting-mysql-groupconcat-to-postgres.html

Опять же, надо смотреть вывод explain analyze, будет ли это работать быстрее предложенного варианта с подзапросом или нет.
 
Сверху