llenar - recorrer array postgresql
Matriz agregada Postgresql (3)
Hola, tengo dos mesas
Student
--------
Id Name
1 John
2 David
3 Will
Grade
---------
Student_id Mark
1 A
2 B
2 B+
3 C
3 A
¿Es posible seleccionar Postgresql nativo para obtener resultados como este?
Name Array of marks
-----------------------
''John'', {''A''}
''David'', {''B'',''B+''}
''Will'', {''C'',''A''}
Pero no así
Name Mark
----------------
''John'', ''A''
''David'', ''B''
''David'', ''B+''
''Will'', ''C''
''Will'', ''A''
Lo que entiendo es que puedes hacer algo como esto:
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;
EDITAR
No estoy seguro. Pero tal vez algo como esto, entonces:
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;
Referencia here
Puede usar lo siguiente:
SELECT Student.Name as Name,
(SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
AS ArrayOfMarks
FROM Student
Como se describe aquí: http://www.mkyong.com/database/convert-subquery-result-to-array/
Use 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
Por cierto, si está usando Postgres 9.1, no necesita repetir las columnas en SELECT para GROUP BY, por ejemplo, no necesita repetir el nombre del estudiante en GROUP BY. Puede simplemente agrupar BY en la clave principal. Si elimina la clave primaria del alumno, debe repetir el nombre del alumno en 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'');