Обновить поле с номером строки в оракуле

Возможный дубликат:
Oracle: обновление столбца таблицы с использованием ROWNUM в сочетании с предложением ORDER BY

У меня есть запрос, который возвращает упорядоченный набор записей, и я хочу скопировать номер строки каждой строки в наборе результатов в определенное поле с именем Sequence в самой записи.

SELECT ROWNUM, ID
FROM (
    SELECT ID 
    FROM MYTABLE 
    WHERE PARENT = 1
    ORDER BY SEQUENCE ASC
)

У меня есть идентификатор каждой строки и rownum, которые я хочу поместить в поле SEQUENCE. Как я могу просмотреть этот набор результатов и соответствующим образом обновить таблицу?


person user1365247    schedule 31.01.2013    source источник
comment
Это очень похоже на stackoverflow.com/questions/6094039/   -  person igr    schedule 31.01.2013
comment
@ user1365247, всегда пытайтесь использовать Row_Number() вместо Rownum.   -  person Art    schedule 31.01.2013


Ответы (2)


merge into mytable t
using (SELECT ROWNUM rn, ID
       FROM (
         SELECT ID 
         FROM MYTABLE 
         WHERE PARENT = 1
         ORDER BY SEQUENCE ASC
      )) S 
on (t.id=s.id)
when matched then update set
  t.sequence=s.rn

Если id не уникален, вы точно можете:

merge into mytable t
using (SELECT ROWNUM rn, rwd
       FROM (
         SELECT rowid rwd
         FROM MYTABLE 
         WHERE PARENT = 1
         ORDER BY SEQUENCE ASC
      )) S 
on (t.rowid=s.rwd)
when matched then update set
  t.sequence=s.rn
person Florin Ghita    schedule 31.01.2013
comment
Я получаю сообщение об ошибке SQL Error: ORA-30926: unable to get a stable set of rows in the source tables, пожалуйста, подтвердите. - person TechDo; 31.01.2013
comment
если идентификатор не уникален, да. - person Florin Ghita; 31.01.2013
comment
да.. вот так.. спасибо за ответ... :) - person TechDo; 31.01.2013

Пожалуйста, попробуй:

  merge into EMP_MASTER x
  using (
          SELECT ID, ROW_NUMBER() OVER(ORDER BY SEQUENCE) y
          FROM MYTABLE 
          WHERE PARENT = 1
         ) s on (s.ID=x.ID)
         when matched then update set
  x.sequence=s.y;

который работает для уникальных идентификаторов.

person TechDo    schedule 31.01.2013
comment
Вы уверены, что это работает? - person Florin Ghita; 31.01.2013
comment
Да, да, это не сработает. Я редактировал с помощью ROW_NUMBER() и MERGE. - person TechDo; 31.01.2013