在Oracle SQL中不使用MERGE INTO的替代方法

时间:2017-03-15 16:58:05

标签: sql oracle

我成功使用以下内容:

hworld

通过在同一个表上使用操作,基本上是同一个表上的UPDATE。子查询返回多行,这很重要。

这是我的表格和结果:

my data

现在我想做同样的事情,但避免MERGE INTO,我尝试了以下但没有成功:

    MERGE INTO table_name tab1 
    USING (SELECT ID,(NVL(col1,0) - NVL(LAG(NVL(col1,0),1) OVER 
(PARTITION BY type order by ID),0)) VAL FROM table_name) bb 
    ON (tab1.ID = bb.ID)
    WHEN matched THEN
      UPDATE SET tab1.col2 = bb.VAL;

最新的SQL代码给了我这个:

    UPDATE 
    (SELECT aa.COL2 as OLD, (NVL(aa.COL1,0) - NVL(LAG(NVL(aa.COL1,0),1) 
OVER (PARTITION BY aa.TYPE order by aa.ID),0)) AS NEW
     FROM table_name aa
     INNER JOIN table_name bb
     ON aa.ID = bb.ID
    ) t
    SET t.OLD = t.NEW;

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

怎么样:

update table_name t
    set col2 = col1 - coalesce( (select max(col1) keep (dense_rank first order by t2.id desc)
                                 from table_name t2
                                 where t2.type = t.type and t2.id < t.id
                                ), 0);

这是一种不同的方法,但它不使用merge