Если я правильно понимаю, тогда должно быть намного более простое решение.
Настройка теста
Согласно вашему описанию - вы могли бы сделать это для нас:
CREATE TABLE table1 (
entry_id int4 PRIMARY KEY
, entry_date date
);
CREATE TABLE table2 (
entry_id int4 REFERENCES table1 (entry_id)
, entry_subject text
, PRIMARY KEY (entry_id, entry_subject)
);
INSERT INTO table1 VALUES (1, '2011-09-01'), (2, '2011-09-02'),(3, '2011-09-03');
INSERT INTO table2 VALUES (1, 'foo1'), (2, 'foo2'), (2, 'bar2')
, (3, 'foo3'), (3, 'baz3'), (3, 'bar3');
Ответ
string_agg()
требуется Postgres 9.0 +
SELECT t1.entry_id, t1.entry_date
, string_agg(t2.entry_subject, ', ') AS entry_subjects
FROM table1 t1
JOIN table2 t2 USING (entry_id)
GROUP BY 1,2
ORDER BY 1;
entry_id | entry_date | entry_subjects
----------+------------+------------------
1 | 2011-09-01 | foo1
2 | 2011-09-02 | bar2, foo2
3 | 2011-09-03 | baz3, bar3, foo3
Или, если вы хотите, чтобы entry_subjects отсортировано :
SELECT DISTINCT ON (1)
t1.entry_id
, t1.entry_date
, string_agg(t2.entry_subject, ', ') OVER (
PARTITION BY t1.entry_id ORDER BY t2.entry_subject
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) AS entry_subjects
FROM table1 t1
JOIN table2 t2 USING (entry_id)
ORDER BY 1;
entry_id | entry_date | entry_subjects
----------+------------+------------------
1 | 2011-09-01 | foo1
2 | 2011-09-02 | bar2, foo2
3 | 2011-09-03 | bar3, baz3, foo3
Вы можете сделать то же самое с подвыбором от table2
до первого ORDER BY entry_subject
.