2016-06-14 2 views
0

У меня есть результат Oracle установить, как показано нижеНевозможно обновить столбец с ROWNUM в Oracle

enter image description here

Мне нужно заменить OLD_ID с RNUM. Я использую следующий запрос

merge into x u 
      using (
         select OLD_ID, FBU_FFF_FFY,FBU_FFY_MONTH,row_number() over (partition by fbu_ffy_month, fbu_fff_ffy order by fbu_ffy_month, fbu_fff_ffy) rnum 
         from x 
      ) s 
      on (u.FBU_FFF_FFY= s.FBU_FFF_FFY and u.FBU_FFY_MONTH = s.FBU_FFY_MONTH) 
      when matched then update set u.OLD_ID = s.rnum; 

Это дает мне ошибку оракула

«не в состоянии получить стабильный набор строк в исходных таблицах»
* Причина: Стабильная набор строк может не получить из-за большого dml действия или неопределенного предложения where.
* Действие: Удалите любые неопределенные предложения where и переиздайте dml.

Любые идеи?

+0

застенчивый делает слияние? почему бы не просто обновить? –

+0

Есть ли причина, по которой 'UPDATE X SET OLD_ID = RNUM' не будет работать? –

+1

Условие соединения возвращает более одной строки. – user2672165

ответ

0

не ваши таблицы, так что я не мог проверить, но как насчет

UPDATE (SELECT rnum, old_id 
      FROM (SELECT OLD_ID, 
         FBU_FFF_FFY, 
         FBU_FFY_MONTH, 
         ROW_NUMBER() 
         OVER (PARTITION BY fbu_ffy_month, fbu_fff_ffy 
          ORDER BY fbu_ffy_month, fbu_fff_ffy) 
          rnum 
        FROM x) s, 
       x u 
     WHERE  u.FBU_FFF_FFY = s.FBU_FFF_FFY 
       AND u.FBU_FFY_MONTH = s.FBU_FFY_MONTH) 
    SET old_id = rnum 
+0

Кстати, попытка сохранить такой порядок будет кошмаром, почему бы просто не оставить старый id из определения таблицы и просто создать представление, которое делает ваше разбиение. то просто выберите из представления –

+0

synatx is wrong –

0

Вы могли бы попытаться присоединиться к себе, используя ROWID. Что-то вроде:

SQL> create table x 
(
old_id number, 
val varchar2(10), 
yr varchar2(4), 
mth varchar2(2) 
) 
Table created. 
SQL> insert into x values (1, 'X', '2016','01') 
1 row created. 
SQL> insert into x values (2, 'Y', '2016','01') 
1 row created. 
SQL> insert into x values (3, 'X', '2016','02') 
1 row created. 
SQL> insert into x values (4, 'Y', '2016','02') 
1 row created. 
SQL> insert into x values (5, 'X', '2016','03') 
1 row created. 
SQL> insert into x values (6, 'Y', '2016','03') 
1 row created. 
SQL> commit 
Commit complete. 
SQL> select * from x 

    OLD_ID VAL  YR MTH 
---------- ---------- ---- --- 
     1 X   2016 01 
     2 Y   2016 01 
     3 X   2016 02 
     4 Y   2016 02 
     5 X   2016 03 
     6 Y   2016 03 

6 rows selected. 
SQL> -- this will update ALL rows of table x 
SQL> update x 
set old_id = (
    select y.rnum 
    from x x2 
    JOIN (
    select rowid as row_id, yr, mth, row_number() over (partition by yr, mth order by yr, mth) rnum 
    from x) y 
    ON (x2.rowid = y.row_id) 
    where x.rowid = x2.rowid 
) 
6 rows updated. 
SQL> commit 
Commit complete. 
SQL> select * from x 

    OLD_ID VAL  YR MTH 
---------- ---------- ---- --- 
     1 X   2016 01 
     2 Y   2016 01 
     1 X   2016 02 
     2 Y   2016 02 
     1 X   2016 03 
     2 Y   2016 03 

6 rows selected. 
Смежные вопросы