将一张表的部分字段数据迁移到另一张表(表结构不同)

时间:2021-08-05 14:52:14
原来有部门,部门下面又产品,产品下面有产品文件,
现在需要将原来的部门移到另一个模块中作为大类,把对应的产品移过去作为子类,把产品文件移过去作为文章。
部门与大类表、产品与小类表、产品文件和文章表结构都是不一样的。主要是需要把整个结构移过去,部分字段是可以舍去的。需要用SQL需要怎么做?

部门表
CREATE TABLE EML_DEPAT
(
  SEQID                  VARCHAR2(12)  NOT NULL,                 --序列号
  DEPAT_NAME             VARCHAR2(50)  NOT NULL,                 --部门名称
CREATE_TIME             DATE               ,  -- 记录创建时间
LAST_UPDATE_TIME        DATE                        -- 最后更新时间
);
ALTER TABLE EML_DEPAT ADD CONSTRAINTS PK_EML_DEPAT PRIMARY KEY(SEQID);
产品表
CREATE TABLE EML_PRODUCT

  SEQID                  VARCHAR2(12)   NOT NULL,                --序列号 
  PRODUCT_NAME           VARCHAR2(100)  NOT NULL,                --产品名称 
  DEPAT_NUM              VARCHAR2(12)   NOT NULL      ,          --所属部门 
  CREATE_TIME             DATE      ,    -- 记录创建时间 
LAST_UPDATE_TIME        DATE                   -- 最后更新时间 
);
ALTER TABLE EML_PRODUCT ADD CONSTRAINTS PK_EML_PRODUCT PRIMARY KEY(SEQID);
产品文件表
CREATE TABLE EML_PRODUCT_FILE
(
  SEQID                 VARCHAR2(12)   NOT NULL,                 --序列号
  FILE_NAME             VARCHAR2(100)   NOT NULL,                 --文件名称
  PRODUCT_NO            VARCHAR2(12)   NOT NULL,                 -- 产品编号
CREATE_TIME             DATE         ,      -- 记录创建时间
LAST_UPDATE_TIME        DATE                  -- 最后更新时间
);
ALTER TABLE EML_PRODUCT_FILE ADD CONSTRAINTS PK_EML_PRODUCT_FILE PRIMARY KEY(SEQID);

大类表
CREATE TABLE EML_MARKET_TYPE
(
  TYPE_ID                  VARCHAR2(12)  NOT NULL,                --序列号
  TYPE_NAME             VARCHAR2(20)  NOT NULL,                --类型名称
  OPER_ID                VARCHAR2(15)  NOT NULL,                --最后修改人
  STATUS                 CHAR(1)   DEFAULT '0' NOT NULL,   --状态
  LAST_UPDATE_TIME        DATE      NOT NULL                 -- 最后更新时间
);
ALTER TABLE EML_MARKET_TYPE ADD CONSTRAINTS PK_EML_MARKET_TYPE PRIMARY KEY(TYPE_ID);

小类表
CREATE TABLE EML_MARKET_PROGRAM
(
  PROGRAM_ID                  VARCHAR2(12)  NOT NULL,                --序列号
  PROGRAM_NAME             VARCHAR2(30)  NOT NULL,                --专栏名称
  TYPE_ID                 VARCHAR2(12)  NOT NULL,             --所属类型
  OPER_ID                VARCHAR2(15)  NOT NULL,                --最后修改人
  STATUS                 CHAR(1)   DEFAULT '0' NOT NULL,   --状态
  LAST_UPDATE_TIME        DATE      NOT NULL                 -- 最后更新时间
);
ALTER TABLE EML_MARKET_PROGRAM ADD CONSTRAINTS PK_EML_MARKET_PROGRAM PRIMARY KEY(PROGRAM_ID);
文章表
CREATE TABLE EML_MARKET_ARTICLE
(
  ARTICLE_ID                  VARCHAR2(12)  NOT NULL,                --序列号
  PROGRAM_ID                  VARCHAR2(12)  NOT NULL,                --所属专栏
  TITLE             VARCHAR2(300)  NOT NULL,                --文章标题
  SUBJECT           VARCHAR2(300)  NULL,                --主题文章名称
  STATUS                 CHAR(1)   DEFAULT '0' NOT NULL,   --状态
  CREATE_TIME          DATE NOT NULL,--创建时间
  LAST_UPDATE_TIME        DATE      NOT NULL                 -- 最后更新时间
);
ALTER TABLE EML_MARKET_ARTICLE ADD CONSTRAINTS PK_EML_MARKET_ARTICLE PRIMARY KEY(ARTICLE_ID);

把部门的名称移到大类中,把对应产品的名称移到小类中,产品文件的名称移到文章表中做文章名。因为表的结构不一样,有些字段是不允许为空的,而且这个结构也需要移过来。所以感到比较困难。有人会做吗?
最后修改人之类的可以任填,就是数据间的对应关系需要保留。

4 个解决方案

#1


有外键约束之类的,先全部去掉。
试试insert into table1(col1,col2,col3) select value1,value2,value3 from table2能否满足。
或者先备份好所有数据,然后改变字段名看看。

#2


不能随意改表的结构的,难办就在这里。如果其他的都可以为空,就好吧了。

#3


我的意思是建个测试环境,逐步转换,没理清不好一步到位。

#4


写个function,可以建几个中间表,把需要修改的源数据先放到中间表,处理完之后再插入到正式表,执行function,一步到位

#1


有外键约束之类的,先全部去掉。
试试insert into table1(col1,col2,col3) select value1,value2,value3 from table2能否满足。
或者先备份好所有数据,然后改变字段名看看。

#2


不能随意改表的结构的,难办就在这里。如果其他的都可以为空,就好吧了。

#3


我的意思是建个测试环境,逐步转换,没理清不好一步到位。

#4


写个function,可以建几个中间表,把需要修改的源数据先放到中间表,处理完之后再插入到正式表,执行function,一步到位