横向查询语法
Posted
技术标签:
【中文标题】横向查询语法【英文标题】:Lateral query syntax 【发布时间】:2016-09-06 11:49:42 【问题描述】:我正在尝试横向处理 Postgres 9.5.3 查询。
select b_ci."IdOwner",
ci."MinimumPlaces",
ci."MaximumPlaces",
(select count(*) from "LNK_Stu_CI" lnk
where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents",
from "Course" c
join "DBObjectBases" b_c on c."Id" = b_c."Id"
join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id"
join "CourseInstance" ci on ci."Id" = b_ci."Id",
lateral (select ci."MaximumPlaces" - "EnrolledStudents") x
我希望最右边的列是该行的“MaximumPlaces”-“EnrolledStudents”的结果,但我正在努力让它发挥作用。目前 PG 正在抱怨“EnrolledStudents”不存在——这正是“横向”的意义所在,不是吗?
select b_ci."IdOwner",
ci."MinimumPlaces",
ci."MaximumPlaces",
(select count(*) from "LNK_Stu_CI" lnk
where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents",
lateral (select "MaximumPlaces" - "EnrolledStudents") as "x"
from "Course" c
join "DBObjectBases" b_c on c."Id" = b_c."Id"
join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id"
join "CourseInstance" ci on ci."Id" = b_ci."Id"
如果我尝试在 select 中内联横向子句(如上所示),它也会感到不安并给我一个语法错误 - 那么它去哪里了?
谢谢,
亚当。
【问题讨论】:
不确定我是否理解。如果我注释掉“横向”行,它会起作用。 这里还需要lateral
吗?不只是(ci."MaximumPlaces" - "EnrolledStudents") as "SomeLabel"
工作吗?
错误:列“EnrolledStudents”不存在 - 无法引用生成的列。正如我所说,我认为这就是横向的 - 它相当于 sql server 的交叉应用。
【参考方案1】:
您错过了 LATERAL 的重点。它可以访问 FROM 子句中的表中的列,但不能访问 SELECT 子句中定义的别名。
如果您想访问 SELECT 子句中定义的别名,您需要添加另一个查询级别,或者使用 FROM 子句中的子查询(AKA 派生表)或使用 CTE (Common Table Expression)。由于 PostgreSQL 中的 CTE 充当优化围栏,因此我强烈建议在这种情况下使用子查询,例如:
select
-- get all columns on the inner query
t.*,
-- get your new expression based on the ones defined in the inner query
t."MaximumPlaces" - t."EnrolledStudents" AS new_alias
from (
select b_ci."IdOwner",
ci."MinimumPlaces",
ci."MaximumPlaces",
(select count(*) from "LNK_Stu_CI" lnk
where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents",
from "Course" c
join "DBObjectBases" b_c on c."Id" = b_c."Id"
join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id"
join "CourseInstance" ci on ci."Id" = b_ci."Id"
) t
【讨论】:
必应!灯亮了!谢谢,马修斯。 (感谢以前的海报试图提供帮助。)以上是关于横向查询语法的主要内容,如果未能解决你的问题,请参考以下文章