2012-10-26 2 views
1

Я хочу обновить таблицу с порядковым номером, я не могу создать процедуру или объект последовательности, поэтому для этого вам нужен запрос на обновление. У меня есть таблица с столбцом даты, основанная на минимальной дате, мне нужно сгенерировать число.Обновить всю таблицу с порядковым номером в oracle

Таблица данных: -

Date_Value 
---------- 
5th Feb 11 
2nd Jan 11 
11th Jan 11 

After Update :- 
SrNo  Date_Value 
------------------- 
1 2nd Jan 11 
2 11th Jan 11 
3 5th Feb 11 
+0

Просьба указать пример (по крайней мере, 2-3 строки) того, что у вас есть, и что вам нужно для его преобразования. Показывать, что вы пробовали до сих пор, также поможет. – Mat

+0

данные добавлены к пояснениям –

+0

Вы действительно не храните свои даты как varchar в таком ужасном формате? –

ответ

4
merge into foo 
using 
(
    select rowid as rid, 
      row_number() over (order by date_value) as seqno 
    from foo 
) t on (foo.rowid = t.rid) 
when matched then update 
    set srno = t.seqno; 

SQLFiddle демо: http://sqlfiddle.com/#!4/d8cc5/2

2

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

SQL> create table TB_DATES 
    2 (
    3 DATE_VALUE VARCHAR2(11) 
    4 ) 
    5/

Table created 

SQL> 
SQL> insert into tb_dates(date_value) 
    2 select '5th Feb 11' from dual union all 
    3 select '2nd Jan 11' from dual union all 
    4 select '6th Feb 11' from dual union all 
    5 select '11th Jan 11' from dual 
    6 ; 

4 rows inserted 

SQL> commit; 

Commit complete 

SQL> select * from tb_dates; 

DATE_VALUE 
----------- 
5th Feb 11 
2nd Jan 11 
6th Feb 11 
11th Jan 11 

SQL> alter table tb_dates add srno number; 

Table altered 

QL> select * from tb_dates; 

DATE_VALUE  SRNO 
----------- ---------- 
5th Feb 11  null 
2nd Jan 11  null 
6th Feb 11  null 
11th Jan 11 null 

SQL> merge into tb_dates t 
    2 using(
    3 select rownum rn 
    4  , Date_value 
    5  , rid 
    6 from (select to_date(concat(lpad(dy, 2, '0'), tr), 'dd Mon yy') dt 
    7    , Date_value 
    8    , rid 
    9    from (select regexp_substr(substr(Date_value, 1, regexp_instr(date_value, '[[:space:]]') - 1), '[[:digit:]]+') dy 
10      , substr(Date_value, regexp_instr(date_value, '[[:space:]]'), length(Date_value)) tr 
11      , Date_value 
12      , rowid rid 
13     from tb_dates) 
14 order by 1 
15 )) q 
16 on (q.rid = t.rowid) 
17 when matched 
18 then update set t.srno = q.rn 
19 ; 

Done 

SQL> commit; 

Commit complete 

select * from tb_dates; 

DATE_VALUE  SRNO 
----------- ---------- 
5th Feb 11   3 
2nd Jan 11   1 
6th Feb 11   4 
11th Jan 11   2 

SQL> select * from tb_dates order by srno; 

DATE_VALUE  SRNO 
----------- ---------- 
2nd Jan 11   1 
11th Jan 11   2 
5th Feb 11   3 
6th Feb 11   4 
+0

жаль путаницы. Данные хранятся в формате даты, но в то время как fecthing мы занимаемся просмотром, мы используем to_char. Извинения за работу ног: P Спасибо –

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