横向查询语法

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

【讨论】:

必应!灯亮了!谢谢,马修斯。 (感谢以前的海报试图提供帮助。)

以上是关于横向查询语法的主要内容,如果未能解决你的问题,请参考以下文章

纵向和横向的引导列视图

媒体查询

横向打印的媒体查询?

移动横向模式的媒体查询问题

如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?

媒体查询不适用于横向