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

Posted

技术标签:

【中文标题】在oracle中将数据从子集表插入超集表【英文标题】:Insert data from a subset table to a superset table in oracle 【发布时间】:2018-04-24 19:01:33 【问题描述】:

我有一个像这样的超集表:

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】:

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

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

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** 

【讨论】:

以上是关于在oracle中将数据从子集表插入超集表的主要内容,如果未能解决你的问题,请参考以下文章

oracle中,如何在一张表插入数据,使得插入数据的某些字段为其他表中的数据

oracle数据库中都有哪些字符集,字符集之间的子集和超集关系是怎么样的?

是否可以在 Oracle 中将表中的一行作为 DML(插入、更新)返回?

试图在php MYSQL中将数据从一个表插入另一个表[关闭]

MySQL 中将一个表的数据插入另外一个表怎么做

SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改