我正在尝试将具有100列的表拆分为20个表,它们都按列拆分,例如,一个表中的列1至列5,第二个表中的列6至10 ...等等。
我想为每个分区添加一个外键字段,该字段可以将每个分区彼此连接,因此分区表将包括第1列至第5列,以及一个可以将每个分区与下一个分区连接的新外键列。
答案 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。