我有两张桌子

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'}

not美元以下

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

推荐答案

使用数组_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 分组依据"中 Select don't need to repeat列,例如,你不需要在"分组依据"中重复学生姓名.您只能按主键分组.如果删除了student上的主键,则需要在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');

Sql相关问答推荐

如何返回字符串中包含相同值的数据?

如何查询未命名对象的SON数组

Snowflake SQL比较克隆x原始计数

当有空单元格时,如何连接列

使用交叉应用透视表在SQL中转换分段时间段&

SUM(条件)在Oracle?

从列的不同值创建列

SQL查询视图与连接?

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

将重复的值更新为下一个空闲数字

返回UPSERT中的旧行值

如何用客户名称计算sum(dr)和sum(cr)

数据库SQL PARSE_SYNTAX_ERROR

如何用QuestDB生成蜡烛图?

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

聚合内部的条件在哪里?

Select 组中的第一行,但在并发环境中

比使用NOT EXISTS更高效的SQL删除方法是什么?

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

SQL日期比较用例;月初至今的报告