2016-10-27 14 views
0

oracle 11gのビューにAUTO_INCREMENT列を作成することができます。OracleのビューでAUTO_INCREMENTを使用してIDを作成する方法

おかげ

+1

私は達成しようとしていることに従いません。ビューはデータを永続化せず、単にストアドクエリです。基礎となるテーブルに永続的な自動インクリメント列を作成しますか?ビュー内の非永続的な(したがって潜在的に可変な)数値列の増加?他に何か? –

+0

[ROWNUM](https://docs.oracle.com/database/121/SQLRF/pseudocolumns009.htm#SQLRF00255)を使用してください –

+0

データが変更されるとRownumが変更されます。その一貫性はありません –

答えて

0

それは基本的なデータ、任意の単一の一意の識別子を持っていないビューのための単一のユニークなID列を戻すことはできませんが、データを一意に識別する複合値を返すことが可能です。次のクエリは、CSVデータをアンピボットう

insert into sample 
select 1, 'a' from dual union all 
select 2, 'b,c' from dual union all 
select 3, 'd,"e",f' from dual union all 
select 4, ',h,' from dual union all 
select 5, 'j,"",l' from dual union all 
select 6, 'm,,o' from dual; 

:CSV列がカンマ区切り値の文字列を含む

create table sample (id number primary key, csv varchar2(4000)); 

たとえば各行の一意のIDとCSVデータのテーブルを与え複合値(IDSEQ)が一意VAL UEを識別し、ID列は、データがどこから来たレコードをidetifies、及びSEQ一意CSV内の位置を特定する:

WITH pvt(id, seq, csv, val, nxt) as (
SELECT id -- Parse out individual list items 
    , 1 -- separated by commas and 
    , csv -- optionally enclosed by quotes 
    , REGEXP_SUBSTR(csv,'(["]?)([^,]*)\1',1,1,null,2) 
    , REGEXP_INSTR(csv, ',', 1, 1) 
FROM sample 
UNION ALL 
SELECT id 
    , seq+1 
    , csv 
    , REGEXP_SUBSTR(csv,'(["]?)([^,]*)\1',nxt+1,1,null,2) 
    , REGEXP_INSTR(csv, ',', nxt+1, 1) 
FROM pvt 
where nxt > 0 
) 
select * from pvt order by id, seq; 

     ID  SEQ CSV  VAL    NXT 
---------- ---------- ---------- ---------- ---------- 
     1   1 a   a     0 

     2   1 b,c  b     2 
     2   2 b,c  c     0 

     3   1 d,"e",f d     2 
     3   2 d,"e",f e     6 
     3   3 d,"e",f f     0 

     4   1 ,h,  [NULL]    1 
     4   2 ,h,  h     3 
     4   3 ,h,  [NULL]    0 

     5   1 j,"",l  j     2 
     5   2 j,"",l  [NULL]    5 
     5   3 j,"",l  l     0 

     6   1 m,,o  m     2 
     6   2 m,,o  [NULL]    3 
     6   3 m,,o  o     0 


15 rows selected. 
関連する問題