在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。