2012-06-07 2 views
46

Привет У меня есть две таблицыPostgresql совокупный массив

Student 
-------- 
Id Name 
1 John  
2 David 
3 Will 

Grade 
--------- 
Student_id Mark 
1   A 
2   B 
2   B+ 
3   C 
3   A 

Можно ли сделать родной Postgresql выбрать, чтобы получить результаты, как это:

Name Array of marks 
----------------------- 
'John',  {'A'} 
'David', {'B','B+'} 
'Will',  {'C','A'} 

Но не как это

Name Mark 
---------------- 
'John',  'A' 
'David', 'B' 
'David', 'B+' 
'Will',  'C' 
'Will',  'A' 

ответ

80

Использование array_agg: http://www.sqlfiddle.com/#!1/5099e/1

SELECT s.name, array_agg(g.Mark) as marks   
FROM student s 
LEFT JOIN Grade g ON g.Student_id = s.Id 
GROUP BY s.Id 

Кстати, если вы используете Postgres 9.1, вы don't need to repeat столбцы на ВЫБРАТЬ ГРУППУ BY, например вам не нужно повторять имя студента в группе GROUP BY. Вы можете просто GROUP BY на первичном ключе. Если вы удалите первичный ключ у ученика, вам нужно повторить имя студента в группе GROUP BY.

CREATE TABLE grade 
    (Student_id int, Mark varchar(2)); 

INSERT INTO grade 
    (Student_id, Mark) 
VALUES 
    (1, 'A'), 
    (2, 'B'), 
    (2, 'B+'), 
    (3, 'C'), 
    (3, 'A'); 


CREATE TABLE student 
    (Id int primary key, Name varchar(5)); 

INSERT INTO student 
    (Id, Name) 
VALUES 
    (1, 'John'), 
    (2, 'David'), 
    (3, 'Will'); 
+2

О мой бог вы так много о своем замечании о выберите/группе, это так здорово! Это было очень неприятно! – mrbrdo

4

То, что я понимаю, что вы можете сделать что-то вроде этого:

SELECT p.p_name, 
    STRING_AGG(Grade.Mark, ',' ORDER BY Grade.Mark) As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

EDIT

Я не уверен. Но, возможно, что-то вроде этого, то:

SELECT p.p_name,  
    array_to_string(ARRAY_AGG(Grade.Mark),';') As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

Ссылка here

+0

Я думаю, что он хочет, чтобы массив PGSQL, а не через запятую, строка – ThiefMaster

+0

Обновить ответ – Arion

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