PostgreSQL查询需求:获取学生全部成果及达成状态
解决方案:获取所有成果及学生达成状态
要实现获取所有成果并展示指定学生(ID 901)的达成状态,需要调整查询的起始表,并通过聚合逻辑判断每个成果的达成情况。以下是针对PostgreSQL的正确查询方案:
SELECT co.id AS outcome_id, co.unit_id, co.content, -- 判断是否存在至少一条部分达成的记录 CASE WHEN MAX(CASE WHEN ceo.partially_met = TRUE THEN 1 ELSE 0 END) = 1 THEN 'True' ELSE 'False' END AS partially_met, -- 判断是否存在至少一条完全达成的记录 CASE WHEN MAX(CASE WHEN ceo.meets_outcome = TRUE THEN 1 ELSE 0 END) = 1 THEN 'True' ELSE 'False' END AS fully_met, 901 AS student_id FROM curriculum_outcomes co -- 左连接到该学生的证据成果关联记录 LEFT JOIN curriculum_evidence_outcomes ceo ON co.id = ceo.outcome_id AND ceo.student_id = 901 GROUP BY co.id, co.unit_id, co.content ORDER BY co.content ASC;
关键逻辑说明:
- 主表选择:以
curriculum_outcomes作为查询起点,确保返回系统中所有的成果,而不是仅学生有证据关联的成果。 - 定向左连接:通过
LEFT JOIN关联curriculum_evidence_outcomes时,直接限定ceo.student_id = 901,避免后续过滤丢失无关联的成果。 - 聚合判断状态:使用
MAX()函数配合CASE表达式,检查每个成果是否存在至少一条部分/完全达成的记录——只要有一条满足,就标记为True,否则为False。 - 分组:按成果的唯一标识(
id)分组,确保每个成果只返回一行结果。
为什么原查询无法满足需求?
原查询从company_students出发关联证据,再关联成果,这会导致没有对应证据的成果被过滤掉。而我们需要的是所有成果为基础,左连接学生的达成记录,这样才能保留所有成果行,即使学生没有相关证据。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

