2012-10-26 33 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

抱歉的混亂。數據是以日期格式存儲的,但是當我們通過視圖運行時,我們使用了to_char。腿部工作的道歉:P謝謝 –