PostgreSQL:公用表表达式和横向连接

Posted

技术标签:

【中文标题】PostgreSQL:公用表表达式和横向连接【英文标题】:PostgreSQL: Common table expressions and Lateral Join 【发布时间】: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)

【问题讨论】:

【参考方案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。但是您肯定要查看其他两个关系之间的连接条件。

【讨论】:

谢谢!正是这样。

以上是关于PostgreSQL:公用表表达式和横向连接的主要内容,如果未能解决你的问题,请参考以下文章

mysql postgresql 查询不指定表名和公用文件夹

python DBUtils 线程池 连接 Postgresql(多线程公用线程池,DB-API : psycopg2)

是否可以使用 Python 将公用表表达式与 impala 一起使用?

Databricks 和 Spark 中的公用表表达式 (CTE)

使用公用表表达式和相关更新标记同一表中的重复数据

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效