2016-01-13 19 views
2

我想實現這一點:PostgreSQL的:公用表表達式和橫向加入

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; 

而且我得到一個錯誤:

ERROR: syntax error at or near "p" LINE 1: ...rom public.vwFactOrder o LEFT JOIN LATERAL Period p on TRUE ... ^(execution time: 219 ms; total time: 437 ms)

回答

0

在你查詢你不使用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。但是你一定要回顧其他兩種關係之間的連接條件。

+0

謝謝!確實如此。 –