2013-09-19 5 views
0

У меня есть таблица, как показано ниже, и мне нужно обновить «SEQUENCE_NO» на основе записи дублирования (SEQUENCE_NO). Мне нужна помощь по этому вопросу:Последовательность обновления для повторяющейся записи

Текущая таблица:

 
----------------------------------------------------------------------------- 
ID |  TYPE_ID | CREATED_DATE | SEQUENCE_NO 
----------------------------------------------------------------------------- 
1    1    24-APR-10   NULL 
----------------------------------------------------------------------------- 
2    1    25-APR-10   NULL 
----------------------------------------------------------------------------- 
3    1    26-APR-10   NULL 
---------------------------------------------------------------------------- 
4    2    22-APR-10   NULL 
---------------------------------------------------------------------------- 
5    2    24-APR-10   NULL 
--------------------------------------------------------------------------- 
6    3    27-APR-10   NULL 

Ожидая результат:

 
----------------------------------------------------------------------------- 
ID |  TYPE_ID | CREATED_DATE | SEQUENCE_NO 
----------------------------------------------------------------------------- 
1    1    24-APR-10   1 
----------------------------------------------------------------------------- 
2    1    25-APR-10   2 
----------------------------------------------------------------------------- 
3    1    26-APR-10   3 
---------------------------------------------------------------------------- 
4    2    22-APR-10   1 
---------------------------------------------------------------------------- 
5    2    24-APR-10   2 
--------------------------------------------------------------------------- 
6    3    27-APR-10   1 

SQL Query или PL программы/SQL должен быть в порядке.

+0

Попробуйте использовать RANK() над TYPE_ID –

ответ

2

Это следует сделать это:

merge into the_table tb 
using (
    select id, 
     row_number() over (partition by type_id order by created_date) as rn 
    from the_table 
) t on (t.id = tb.id) 
when matched then update 
    set sequence_no = t.rn; 

Видимо id колонка не ваш первичный ключ (который вы должны были сказать нам прямо с самого начала).

Вы можете найти уникальную комбинацию столбцов в таблице, чтобы сделать соединение между объединенной таблицей и запросом или в качестве быстрого обходного пути (для Oracle) вы можете использовать rowid для объединения запроса и объединенной таблицы:

merge into the_table tb 
using (
    select rowid as rid, 
     row_number() over (partition by type_id order by created_date) as rn 
    from the_table 
) t on (t.rid = tb.rowid) 
when matched then update 
    set sequence_no = t.rn; 

Как вы, очевидно, ищет решение для Oracle и SQL Server (что опять-таки вы не упоминаете в исходном вопросе) выше, не будет работать с SQL Server (он не имеет ничего подобного для Oracle's rowid).

Чтобы сделать эту работу надежно в обеих СУБД, у вас есть, чтобы найти первичный ключ для таблицы.

+0

Спасибо за ваш запрос ... но показывает ошибка «t.id = id.id ». – Srinivash

+0

@Srinivash: извините, скопируйте и вставьте ошибку. Должно быть 't.id = tb.id' –

+0

да ... его отлично работает в SQL Server ... но не в oracle sql-разработчике ... Я столкнулся с следующей ошибкой: Отчет об ошибке: Ошибка SQL: ORA-30926 : невозможно получить стабильный набор строк в исходных таблицах 30926. 00000 - «невозможно получить стабильный набор строк в исходных таблицах» * Причина. Не удалось получить стабильный набор строк из-за большого dml деятельности или неопределенного положения. * Действие: Удалите любые недетерминированные предложения where и переиздайте dml. – Srinivash

0
select ID,TYPE_ID,CREATED_DATE,ROW_NUMBER() OVER (PARTITION BY TYPE_ID) AS SEQUENCE_NO 
FROM Table_name 

Try This Дайте мне знать, если его работы или нет

+0

Привет, Сандип, его не работает bcoz, его пропустили предложение ORDER BY ...и я хочу обновить поле не для выбора – Srinivash

+0

'UPDATE TABLE_NAME SET RankCol = SubQuery.Rank ОТ ( SELECT, идентификатор TYPE_ID, CREATED_DATE, ROW_NUMBER() OVER (PARTITION BY TYPE_ID ORDER BY type_id) А.С. Ранг FROM table_name ) подзапрос INNER JOIN table_name ON SubQuery.ID = Table_name.ID И SubQuery.TYPE_ID = Table_name.TYPE_ID' Будет ли это работать? Просто проверьте и дайте мне знать –

Смежные вопросы