2016-01-20 29 views
0

我需要增加下一个NEWLOSAL行的值,比以前的NEWHISA大1。 像HISALLOSAL列。 NEWLOSAL需要先前NEWHISAL + 1PL/SQL增加新行的值,以前的值为

enter image description here

+0

什么时候需要增加,插入?或者你想一次更新整个表格? – Hawk

+0

我需要更新表格, –

+0

UPDATE SALGRADE SET NEWHISAL = hisal + hisal * GRADE * 10/100; 这是我如何增加NEWHISAL。 –

回答

1

并不知道这是你想要什么:

merge into table1 tg 
using 
(
    select id, -- I assume this is the PK column 
      lag(newhisal) over (order by grade) + 1 as new_losal 
    from table1 
) nv on (nv.id = tg.id) 
when matched then update 
    set tg.newlosal = nv.new_losal; 

在SQL行:

update table1 t1 
    set t1.Newlosal=case when t1.grade=1 then (t1.Newhisal+1) else (select t2.Newhisal+1 from table1 t2 where t2.grade = (t1.grade-1)) end 
    WHERE EXISTS (
SELECT 1 
    FROM table1 t2 
WHERE t2.grade=(t1.grade-1)) 
+0

这很好,但它对于第一行返回null。 –

+0

@ Richard.McConory因为你没有告诉我们如何处理第一行我的男人,我刚刚编辑添加一个案例,当在第一行的更新中,我将它设置为自己的Newhisal + 1 –

+0

我更新第一行,在此查询之前,它工作:) 谢谢。 –

0

这可以有效地使用merge语句和窗函数来完成在表中(或结果)或未订购,所以“上一行”的概念只有使得森如果你定义了排序顺序。这就是over (order by grade)在窗口函数中所做的。从屏幕截图中我无法判断这个列应该排序。

屏幕截图也不会显示表格的主键列。我认为它被命名为ID。你必须改变它以反映你真正的PK栏名称。

我也没有在窗口函数中包含partition by子句,假设公式应该以相同的方式应用于所有行。如果情况并非如此,则需要更详细地说明您的样本数据。