2013-04-27 79 views
0

我有3個主鍵。 CompanyName,EmpNo,StartDate。在oracle中更新倒數第二個記錄sql

我想創建一個存儲過程,只允許我更新每個empno的倒數第二個記錄。我怎樣才能做到這一點?在這種情況下,我必須記錄每個empnno,但我只想更新倒數第二個記錄,無論記錄的數量爲多少 ex;如果我有100條記錄,我想更新同一個empno的第99條記錄。

CompanyNo EmpNo StartDate FinalDate 
1   1  1999/01/01 2013/04/26 
1   1  2013/04/17 9999/12/31 
1   2  1999/01/0 2013/04/26 
1   2  2013/04/17 9999/12/31 
1   3  1999/01/01 2013/04/26 
1   3  2013/04/17 9999/12/31 

在這種情況下,我只想編輯FinalDate中倒數第二。 這些;

CompanyNo EmpNo StartDate FinalDate 
1   1  1999/01/01 2013/04/26 <--- this finaldate field 
1   2  1999/01/01 2013/04/26 <--- this finaldate field 
1   3  1999/01/01 2013/04/26 <--- this finaldate field 
+0

您的主鍵是如何表示記錄的順序的? – 2013-04-27 07:54:50

+0

「編輯行」的含義是什麼?你想阻止對方的更新?你想要在那一行更新什麼? – 2013-04-27 07:57:45

+0

我試着訂購ASC的3個主鍵,然後嘗試使用ROW_NUMBER,但也許我錯過了一些東西。 – Edu 2013-04-27 08:07:23

回答

-2

Oracle在查詢中提供了一個名爲ROWNUM的僞列。因此,如果您知道數據集的總大小(對其進行計數),則可以使用ROWNUM訪問倒數第二行,獲取主鍵值並正確更新。

+0

他的數據示例? – Scotch 2013-04-27 06:35:26

0

製作你想要什麼假設,你可以通過這個

SELECT empNo FROM 
    (
    SELECT companyName, empNo, rank() over (PARTITION BY companyName,empNo 
    ORDER BY FinalDate DESC) as rankings FROM yourTable 
     ) WHERE ranking = 2 

得到每個EMPNO /公司第二finalfate你可以做你需要通過

Update yourTable set something = something WHERE empNo IN ( thatQueryAbove) 
+0

我編輯了我的問題。道歉。也許需要更加明確。先謝謝你。 – Edu 2013-04-27 08:05:27

+0

@a_horse_with_no_name用於在多個列上進行分區,是否需要將每個列名稱括在括號內? – Scotch 2013-04-27 08:13:32

+0

@a_horse_with_no_name你說得對,我很確定它是括號。也許括號也適用。 – Scotch 2013-04-27 08:18:23

0

我不任何更新看看爲什麼你需要一個存儲過程。

merge into employment emp 
using 
(
    select CompanyName, 
      empno, 
      startdate, 
      finaldate, 
      row_number() over (partition by CompanyName, EmpNo order by StartDate desc) as rnk 
    from employment 
) t on (t.companyname = emp.companyname and t.empno = emp.empno and t.startdate = emp.startdate and t.rnk = 2) 
when matched then update 
    set finaldate = date '2013-04-28'; 

這將finaldate那些行改爲'2013-04-28'

雖然我不得不承認,我不明白你是什麼真正想:你描述可以用一個語句來完成做。

+0

我想編輯每個員工的倒數第二個記錄。今天晚些時候我會嘗試你的代碼。 – Edu 2013-04-28 02:49:37

+0

@Edu:術語「編輯」對SQL沒有任何意義。您更新,刪除或插入行。你不要「編輯」它們。 – 2013-04-28 05:41:48

+0

我在評論你的代碼時誤會了,但我在標題中使用了術語更新。對困惑感到抱歉。 – Edu 2013-04-30 03:43:54