【问题标题】:Postgre equivalent of MSSQL outer applyPostgres 相当于 MYSQL 外部应用
【发布时间】:2020-03-30 21:18:28
【问题描述】:

以下代码适用于 MSSQL。关于如何将其翻译为 Postgre 的任何建议?

;with mySource  as (
  SELECT 1050
LineID, 1 SeqNo, NULL Val
UNION SELECT 1050 LineID, 2
SeqNo, NULL Val
UNION SELECT 1050 LineID, 3
SeqNo, 'ABC' Val
UNION SELECT 1050 LineID, 4
SeqNo, NULL Val
UNION SELECT 1050 LineID, 5
SeqNo, NULL Val
UNION SELECT 1050 LineID, 6
SeqNo, 'CDE' Val
UNION SELECT 1050 LineID, 7
SeqNo, NULL Val
UNION SELECT 1050 LineID, 8
SeqNo, NULL Val
UNION SELECT 1050 LineID, 9
SeqNo, 'EFG' Val
UNION SELECT 1050 LineID, 10
SeqNo, NULL Val
UNION SELECT 2222 LineID, 1
SeqNo, NULL Val
UNION SELECT 2222 LineID, 2
SeqNo, 'ABC' Val
UNION SELECT 2222 LineID, 3
SeqNo, 'CDE' Val
UNION SELECT 2222 LineID, 4
SeqNo, NULL Val
UNION SELECT 2222 LineID, 5
SeqNo, NULL Val
UNION SELECT 2222 LineID, 6
SeqNo, 'EFG' Val
UNION SELECT 2222 LineID, 7
SeqNo, NULL Val
UNION SELECT 2222 LineID, 8
SeqNo, 'HIJ' Val
UNION SELECT 2222 LineID, 9
SeqNo, NULL Val
UNION SELECT 2222 LineID, 10
SeqNo, 'KLM' Val
) 
Select LineID,SeqNo, Coalesce(bu,ba) Val 
from mySource m
outer apply (select top 1 Val 
from mySource m1 
WHERE m1.LineID=m.LineID and m1.SeqNo<=m.SeqNo and Val is not null 
Order by SeqNo DESC) d1(bu) 
outer APPLY (SELECT TOP 1 Val 
FROM mySource m3 
WHERE  m3.LineID=m.LineID and m3.SeqNo>= m.SeqNo AND Val IS NOT NULL 
ORDER  BY SeqNo) d3(ba)
ORDER BY m.LineID, m.SeqNo

【问题讨论】:

    标签: sql postgresql tsql outer-apply


    【解决方案1】:

    在 Posgres 中 outer apply 的等价物是 left join lateral。您还需要将特定于 T-SQL 的 TOP 1 替换为 LIMIT

    也可以缩短公用表表达式以使用values() 语法。

    with mySource(LineID, SeqNo, Val)  as (values
        (1050, 1, null),
        (1050, 2, null),
        (1050, 3, null),
        ...
        (2222, 10, 'KLM')
    )
    select LineID, SeqNo, Coalesce(bu,ba) Val 
    from mySource m
    left join lateral (
        select Val bu 
        from mySource m1 
        where m1.LineID = m.LineID and m1.SeqNo <= m.SeqNo and Val is not null 
        order by SeqNo desc
        limit 1
    ) d1 on true 
    left join lateral (
        select Val ba
        from mySource m3 
        where m3.LineID = m.LineID and m3.SeqNo >= m.SeqNo AND Val is not null 
        order  by SeqNo
        limit 1
    ) d3 on true
    order by m.LineID, m.SeqNo
    

    查看查询,我倾向于怀疑它的逻辑可以通过窗口函数大大简化(想到lag()lead())。您可能想问另一个问题,详细说明您要完成的工作,以及示例数据和预期结果。

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      相关资源
      最近更新 更多