将数据从子集表插入到oracle中的超集表

时间:2018-04-24 19:01:34

标签: oracle plsql insert

我有一个超集集表如下:

col1 col2 col3 col4 col5 col6 

我也有子集表,其列将动态创建,我之前不知道列名,但列名将始终是超集表中存在的列的子集:

例如。 子集表可能是:

**CASE1**:

col1 col2
1     2

或者在某些情况下可能是

**CASE2**:

col1 col5 col6
1     5    6

或者可能是:

**CASE3**:

col3 col6 
3    6

我想在超集表中仅为子集中存在的列插入数据。对于子集中不存在的列,我想设置一些默认值:

案例1: 超集表应该有:

 col1 col2  col3            col4            col5            col6
 1    2     defualt_value   defualt_value   defualt_value   defualt_value 

案例2: 超集表应该有:

 col1   col2            col3            col4            col5    col6
 1      defualt_value   defualt_value   defualt_value   5       6

案例3: 超集表应该有:

col1           col2            col3   col4            col5               col6
defualt_value  defualt_value   3      defualt_value   defualt_value       6

请帮助!!

1 个答案:

答案 0 :(得分:0)

也许这会有所帮助......

测试表和数据(来自您的问题:“...仅在子集中存在的那些列中插入超集表中的数据。对于子集中不存在的列,我想设置一些默认值”)

create table superset (
  id   number generated always as identity start with 7000 primary key
, col1 number default 111
, col2 number default 222
, col3 number default 333
, col4 number default 444
, col5 number default 555
, col6 number default 666
, remarks varchar2( 256 ) default 'subset id unknown'
);

-- insert test data
begin
-- case 1
  insert into superset ( col1, col2, remarks ) values ( 1, 2, '**CASE1**' ) ;
-- case 2
  insert into superset ( col1, col5, col6, remarks ) values ( 1, 5, 6, '**CASE2**' ) ;  
-- case 3
  insert into superset ( col3, col6, remarks ) values ( 3, 6 , '**CASE3**') ;
--4 some other stuff - the inserted rows do not belong to any known subset
  insert into superset ( col1 ) values ( 1 );
  insert into superset ( col2 ) values ( 2 );
  insert into superset ( col3 ) values ( 3 );
  insert into superset ( col4 ) values ( 4 );
  insert into superset ( col5 ) values ( 5 );
  insert into superset ( col6 ) values ( 6 );
end;
/

SUPERSET表现在包含:

SQL> select * from superset;
ID    COL1  COL2  COL3  COL4  COL5  COL6  REMARKS            
7000  1     2     333   444   555   666   **CASE1**          
7001  1     222   333   444   5     6     **CASE2**          
7002  111   222   3     444   555   6     **CASE3**          
7003  1     222   333   444   555   666   subset id unknown  
7004  111   2     333   444   555   666   subset id unknown  
7005  111   222   3     444   555   666   subset id unknown  
7006  111   222   333   4     555   666   subset id unknown  
7007  111   222   333   444   5     666   subset id unknown  
7008  111   222   333   444   555   6     subset id unknown 

现在,您可以为每个子集创建一个视图,例如

create or replace view subset1_view
as 
select col1, col2 
from superset
where remarks = '**CASE1**' ;

SQL> select * from subset1_view;
COL1  COL2  
1     2 

或者

create or replace view subset1_view
as 
select * 
from superset
where remarks = '**CASE1**' ;

SQL> select * from subset1_view;
ID    COL1  COL2  COL3  COL4  COL5  COL6  REMARKS    
7000  1     2     333   444   555   666   **CASE1**