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 一起使用?