如何将具有4列的表拆分为2个具有2列的表

时间:2019-10-30 09:51:47

标签: sql oracle

我正在尝试将具有100列的表拆分为20个表,它们都按列拆分,例如,一个表中的列1至列5,第二个表中的列6至10 ...等等。

我想为每个分区添加一个外键字段,该字段可以将每个分区彼此连接,因此分区表将包括第1列至第5列,以及一个可以将每个分区与下一个分区连接的新外键列。

1 个答案:

答案 0 :(得分:0)

您可以使用sql生成两个sql脚本。一种创建表,另一种将数据复制到目标表。您必须在表上具有主键才能关联数据。 PK_COLUMN_LIST是主键列的列表,例如EMPLOYEE_ID,MANAGER_ID。 PK_COLUMN_LIST_QUOTED是主键列的列表,但带有引号,例如'EMPLOYEE_ID','MANAGER_ID'。如果您没有主键,请添加一列并为每行分配一个序列。

    select 'CREATE TABLE <TABLE_NAME>'|| min(c.column_id)|| ' as select 
    <PK_COLUMN_LIST> '||listagg(column_name,',')within group(order by c.column_id ) 
     ||' from <TABLE_NAME> where 1=0;'
    from user_tab_columns c where table_name = '<TABLE_NAME>'
    and c.COLUMN_NAME  not in (<PK_COLUMN_LIST_QUOTED>)
    group by mod(c.COLUMN_ID, 20);
    select 'INSERT ALL' from dual
    union all
    select  ' INTO <TABLE_NAME>'|| min(c.column_id)|| ' (  <PK_COLUMN_LIST>'||
    listagg(column_name,',')within group(order by c.column_id ) 
    || ') values ( <PK_COLUMN_LIST> ,'||  listagg(column_name,',')within group(order by c.column_id )    ||' )'
    from user_tab_columns c where table_name = '<TABLE_NAME>'
    and c.COLUMN_NAME  not in (<PK_COLUMN_LIST_QUOTED>)
    group by mod(c.COLUMN_ID, 20)
    union all select 
    'select t.* from <TABLE_NAME> t' from dual;

这些sql语句的输出可以在脚本中运行,或者,如果您需要使过程自动化,则可以选择变量并立即执行或使用dbms_sql。