Sql Table 从 Postgres 函数的结果中选择
Posted
技术标签:
【中文标题】Sql Table 从 Postgres 函数的结果中选择【英文标题】:Sql Table Select from the results of a Postgres function 【发布时间】:2019-02-26 22:36:38 【问题描述】:我有一个函数可以生成下面定义的评估信息类型。
create type course_assessment_info as (
total_count int,
mark_average double precision,
weight_sum double precision,
weighted_mark_average double precision
);
当我将我的函数用于单个查询时,如下所示,我得到了预期的结果。
select *
from course_assessment_info_by_student_id_and_course_id('9be15896-40ca-46c6-8fdd-0ffe3bd79
586', '65dbdce1-fd76-4951-9db1-d089b3794d80');
结果:
total_count | mark_average | weight_sum | weighted_mark_average
-------------+-------------------+-------------------+-----------------------
1 | 0.834768535328714 | 0.540032932289522 | 0.450802499916595
当我在使用连接的较大函数上使用它时,我没有得到单独的列名。 我的理解是我需要使用 select * from course_asses ... 但是,我很难弄清楚如何格式化以使 PostgreSQL 不会引发语法错误。
select course_assessment_info_by_student_id_and_course_id(s.id, c.id)
from student s
join student_course sc on s.id = sc.student_id
join course c on c.id = sc.course_id;
感谢您的帮助!
【问题讨论】:
您的函数应该在您的 FROM 子句中,而不是在您的 SELECT 子句中。此外,它有助于包含现有代码生成的错误。看起来您可能需要按照***.com/questions/11472790/… 使用 LATERAL JOIN,但我不是 postgres 用户,所以我无法提供更多帮助 看来您需要LATERAL
加入。
【参考方案1】:
你似乎想要LATERAL JOIN
:
SELECT t.*
FROM student s
INNER JOIN student_course sc ON s.id = sc.student_id
INNER JOIN course c ON c.id = sc.course_id
INNER JOIN LATERAL course_assessment_info_by_student_id_and_course_id(s.id, c.id) t ON true
这也应该这样做:
select (course_assessment_info_by_student_id_and_course_id(s.id, c.id)).*
from student s
join student_course sc on s.id = sc.student_id
join course c on c.id = sc.course_id;
【讨论】:
以上是关于Sql Table 从 Postgres 函数的结果中选择的主要内容,如果未能解决你的问题,请参考以下文章
从java调用带有UDT参数的postgres函数给SQL尚未实现异常