在 Postgresql 中对两个表使用横向
Using Lateral on Two Tables in Postgresql
大家好,
我需要一些帮助来弄清楚如何在 Postgresql 中跨两个 table 使用 lateral
。
我有两个 table、student
和 course
,以及一个函数 student_course_assessment_info_by_course(student_id, course_id): course_assessment_info
,它获取学生记录的 ID 和课程记录的 ID 并获得一些成绩该学生的信息,例如他们的平均水平。
我想使用此函数创建另一个名为 students_near_gpa_minimum
的函数,该函数为所有处于课程最低 gpa 一定分数范围内的学生获得 table 和 student_id,course_id,gpa,minimum_gpa
。
到目前为止,我明白我应该能够使用 lateral
程序 运行 对学生 table 的课程评估功能 "per row",但我由于评估功能同时需要学生 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");
有效!
您可以像这样使用您的函数获取学生和课程的所有组合的成绩
select *
from student
cross join course
cross join lateral student_course_assessment_info_by_course(student."id", course."id")
但是,它是每个课程和学生的组合。如果您只对实际有效的课程和学生的组合感兴趣(因此学生学习了该课程),那么必须有一个 course_student
table 需要与 student
和course
.
编辑
如果您对学生实际学习的课程成绩感兴趣,那么运行以下
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
大家好,
我需要一些帮助来弄清楚如何在 Postgresql 中跨两个 table 使用 lateral
。
我有两个 table、student
和 course
,以及一个函数 student_course_assessment_info_by_course(student_id, course_id): course_assessment_info
,它获取学生记录的 ID 和课程记录的 ID 并获得一些成绩该学生的信息,例如他们的平均水平。
我想使用此函数创建另一个名为 students_near_gpa_minimum
的函数,该函数为所有处于课程最低 gpa 一定分数范围内的学生获得 table 和 student_id,course_id,gpa,minimum_gpa
。
到目前为止,我明白我应该能够使用 lateral
程序 运行 对学生 table 的课程评估功能 "per row",但我由于评估功能同时需要学生 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");
有效!
您可以像这样使用您的函数获取学生和课程的所有组合的成绩
select *
from student
cross join course
cross join lateral student_course_assessment_info_by_course(student."id", course."id")
但是,它是每个课程和学生的组合。如果您只对实际有效的课程和学生的组合感兴趣(因此学生学习了该课程),那么必须有一个 course_student
table 需要与 student
和course
.
编辑
如果您对学生实际学习的课程成绩感兴趣,那么运行以下
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