在Oracle SQL中不使用合并到的替代方案

在Oracle SQL中不使用合并到的替代方案,sql,oracle,Sql,Oracle,我成功地使用了以下工具: 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.

我成功地使用了以下工具:

    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;
这基本上是通过对同一个表的操作对同一个表进行更新。子查询返回多行,这一点很重要

这是我的表格和结果:

现在我想做同样的事情,但避免合并到,我尝试了以下方法,但没有成功:

    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;
最新的SQL代码告诉我:

SQL Error: ORA-01732: data manipulation operation not legal on this view
01732. 00000 -  "data manipulation operation not legal on this view"
有什么想法吗?

怎么样:

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);
这是一种不同的方法,但不使用合并。

如何:

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的原因,这会有所帮助,这似乎是解决此类问题的最佳解决方案。因为MERGE-INTO已开始给我以下错误:“socket不再提供数据”,我的老板告诉我最好不要更改数据库设置。你确定错误的原因是合并到?你是如何得出结论的?我没有得出任何结论,我被告知要这样做。我明天会尝试这个,并尽快给你反馈。好吧,这会用与col1中完全相同的值填充col2,这不是我想要的,它没有给出我发布的值,请参见上面的图片,这基本上是使用前一行的值减去col1值。@Web。order by应该是desc。我明天会试试这个,并尽快给你反馈。好吧,这个填充col2的值与col1中的值完全相同,这不是我想要的,它没有给出我发布的值,请参见上面的图片,这基本上是使用前一行的值减去col1值。@Web。订单号应为desc。