You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:28:40