2013-04-27 2 views
0

У меня есть 3 первичных ключа. CompanyName, EmpNo, StartDate.обновление второй до последней записи в оракуле sql

Я хочу создать хранимую процедуру, которая позволит мне обновить только вторую по последнюю запись каждого empno. Как я могу это достичь? В этом случае у меня есть записи на empnno, но я хочу обновлять только вторую по последней записи независимо от количества записей ex; Если у меня есть 100 записей, я хочу обновить 99-ю запись того же empno.

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

Как ваш первичный ключ выражает порядок записей? –

+0

Что именно вы имеете в виду под «редактированием строки»? Вы хотите предотвратить обновление с другой? Что именно вы хотите обновить в этой строке? –

+0

Я попытался заказать 3 основных ключа ASC, а затем попытался использовать ROW_NUMBER, но, возможно, я что-то упустил. – Edu

ответ

-2

Oracle предоставляет псевдо-столбец под названием ROWNUM в запросах. Поэтому, если вы знаете общий размер своего набора данных (подсчитаете его), вы можете получить доступ ко второй-последней строке с помощью ROWNUM, получить значения первичного ключа и правильно его обновить.

+0

Пример с его данными? – Scotch

0

Делая предположения о том, что вы хотите, вы можете получить второе finalfate для каждого Empno/компании этим

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

И вы можете делать все обновления, вам нужно по

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

Я отредактировал мой вопрос. Извиняюсь. Может быть, нужно быть более явным. Заранее спасибо. – Edu

+0

@a_horse_with_no_name для разбиения на несколько столбцов, необходимо ли заключить каждое имя столбца в скобки? – Scotch

+0

@a_horse_with_no_name Вы правы, но я уверен, что это круглые скобки. Возможно, скобки тоже работают. – Scotch

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

+0

@Edu: термин «редактировать» не имеет никакого смысла в SQL. Вы обновляете, удаляете или вставляете строки. Вы не редактируете их. –

+0

Я ошибся, комментируя ваш код, но я использовал термин «обновление» в заголовке. Извините за путаницу. – Edu