一尘不染

PostgreSQL聚合数组

sql

我有两个桌子

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

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

是否可以使本机Postgresql SELECT获得如下结果:

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

不是 像下面

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

阅读 195

收藏
2021-03-17

共1个答案

一尘不染

使用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,则无需在SELECT到GROUP
BY上重复SELECT上的列,例如,您无需在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');
2021-03-17