【问题标题】:Using Lateral on Two Tables in Postgresql在 Postgresql 中的两个表上使用横向
【发布时间】:2026-02-05 03:55:01
【问题描述】:

大家好,

我需要一些帮助来弄清楚如何在 Postgresql 的两个表中使用 lateral。 我有两个表,studentcourse,还有一个函数 student_course_assessment_info_by_course(student_id, course_id): course_assessment_info,它获取学生记录的 ID 和课程记录的 ID,并获取该学生的一些成绩信息,例如他们的平均成绩。 我想使用这个函数来创建另一个名为students_near_gpa_minimum 的函数,它为所有在课程最低gpa 分数范围内的学生获取一个带有student_id,course_id,gpa,minimum_gpa 的表格。

到目前为止,我知道我应该能够使用 lateral 程序在学生表上“按行”运行课程评估功能,但我很难弄清楚如何准确地做到这一点,因为评估功能需要学生ID和课程ID。 我在下面的函数抱怨课程列不存在——这是真的。 我还需要遍历可用的课程。

select * from 
  (select * from ontrack.student) students,
  lateral (select * from ontrack.student_course_assessment_info_by_course(students."id", "2b0df865-d7c6-4c96-9f10-992cd409dedb")) grades;

我知道这可以通过查询所有数据然后用 C++ 之类的语言计算结果来相当容易地解决,但我正在尝试正确处理 SQL,我觉得如果我了解如何执行此操作这种操作将是非常有益的。 话又说回来,也许这真的是应该在 sql 之外完成的事情。

感谢任何帮助,谢谢!

select student.id, weighted_mark_average
from student
cross join course
cross join lateral course_assessment_info_by_student_id_and_course_id(student."id", course."id");

这行得通!

【问题讨论】:

    标签: sql postgresql join lateral-join


    【解决方案1】:

    您可以使用这样的函数获取学生和课程的所有组合的成绩

    select * 
    from student
    cross join course
    cross join lateral student_course_assessment_info_by_course(student."id", course."id")    
    

    但是,它是每个课程和学生的组合。如果您只对实际有效的课程和学生的组合感兴趣(因此学生学习了该课程),那么必须有一个 course_student 表需要与 studentcourse 连接。

    编辑

    如果您对学生实际学习的课程成绩感兴趣,请运行以下命令

    select s.id, c.id, sc.grade
    from student s
    join student_course sc on s.id = sc.student_id
    join course c on c.id = sc.course_id
    

    【讨论】:

    • 漂亮!我工作得很好。我确实有一个student_course 课程表。我将如何加入它以按照您的建议应用过滤器?