【问题标题】:PostgreSQL: Common table expressions and Lateral JoinPostgreSQL:公用表表达式和横向连接
【发布时间】:2016-01-13 21:38:43
【问题描述】:

我想实现这个:

with Period as
(
SELECT 
    dp.dtIni as dtRefPeriod,
    dp.dtEnd - p.days * interval '1 day' as dtIniWindow,
    dp.dtEnd,
    p.days
FROM public.vwDimPeriod dp
LEFT JOIN LATERAL ( select cast(vlParam as decimal(18,4)) as days
                    from public.DBParam
                    where cdparam = 'LifeTimeValueDays' ) p on TRUE
WHERE dp.dtEnd < CURRENT_DATE
)
,Orders as
(       
select 
    p.dtRefPeriod,
    o.nmEmail,
    dtOrder,
    p.dtIniWindow,
    p.dtEnd,
    o.cdOrder,
    o.vlOrder,
    p.days
from 
    public.vwFactOrder o
LEFT JOIN LATERAL Period p on TRUE
where
    ltrim(rtrim(o.nmEmail)) <> ''
    and o.blValid = B'1'
)
select * from Orders;

我得到一个错误:

错误:“p”处或附近的语法错误 LINE 1: ...rom public.vwFactOrder o LEFT JOIN LATERAL Period p on TRUE ... ^(执行时间:219 ms;总时间:437 ms)

【问题讨论】:

    标签: postgresql common-table-expression


    【解决方案1】:

    在您的查询中,您不使用LATERAL JOIN:使用先前指定关系的列来选择另一个关系的列/行 - 那么为什么要使用它呢?此外,在此查询中使用 CTE 不是必需的或有用的,因此 - 除非您的查询中有一些您没有向我们展示的内容 - 为什么不使用这样的简单查询:

    SELECT
        dp.dtIni AS dtRefPeriod,
        o.nmEmail,
        o.dtOrder,
        dp.dtEnd - p.days * interval '1 day' AS dtIniWindow,
        dp.dtEnd,
        o.cdOrder,
        o.vlOrder,
        p.days
    FROM
        public.vwFactOrder o
        LEFT JOIN public.vwDimPeriod dp
        LEFT JOIN ( SELECT cast(vlParam AS decimal(18,4)) AS days
                    FROM public.DBParam
                    WHERE cdparam = 'LifeTimeValueDays' ) p ON true
    WHERE
        dp.dtEnd < CURRENT_DATE
        AND btrim(o.nmEmail) <> ''
        AND o.blValid;
    

    请注意,您实际上是在进行交叉连接,因为您没有指定任何连接条件。在DBParam 的情况下,这似乎是合理的,因为它们看起来像参数值。如果是这样并且参数始终存在并且具有值,则不需要LEFT JOIN,而是需要更简单和更有效的CROSS JOIN。但是您肯定要查看其他两个关系之间的连接条件。

    【讨论】:

    • 谢谢!正是这样。
    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2021-02-21
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多