2016-01-20 51 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子句,假設公式應該以相同的方式應用於所有行。如果情況並非如此,則需要更詳細地說明您的樣本數據。