我有两个Oracle表,一个旧表和一个新表。 旧的设计很糟糕(比我的更多,请注意)但是有很多当前数据需要迁移到我创建的新表中。
新表有新列,不同列。
我只想写一个PHP脚本或者用一大堆字符串替换的东西......显然这是一种愚蠢的方法。
我真的希望能够在整个过程中清理数据。有些它与标记一起存储(例如:“
第一名字”),大量的空白等,所以我真的想在将它放入新表之前解决所有问题。< / p>
有没有人有这样的经历?我该怎么办?
谢谢:)
答案 0 :(得分:7)
我这么做了 - 您可以使用简单的select statememt进行迁移:
create table newtable as select
field1,
trim(oldfield2) as field3,
cast(field3 as number(6)) as field4,
(select pk from lookuptable where value = field5) as field5,
etc,
from
oldtable
对于清理和转换数据时,在本机SQL中无法做到的像php这样的中间语言几乎无法做到。
对于更复杂的清理,你总是可以创建一个可以解决繁重问题的sql函数,但是我已经清理了一些非常可怕的数据而没有求助于它。不要忘记在oracle中你有解码,案例陈述等。
答案 1 :(得分:0)
我会查看像Pentaho Kettle这样的ETL工具。您将能够查询旧表中的数据,进行转换和清理,然后将其重新插入到新表中,所有这些都使用了一个漂亮的WYSIWYG工具。
这是我之前回答的有关使用Kettle进行数据迁移和操作的问题 Using Pentaho Kettle, how do I load multiple tables from a single table while keeping referential integrity?
答案 2 :(得分:0)
如果数据量不大,如果你只打算这样做一次,那么很难打败自己动手的程序。特别是如果你有一些自定义逻辑,你需要实现。 下载,学习和使用的时间使用工具(如pentaho等)可能不值得你这么做。
对select *进行编码,更新内存和列中的列。使用PHP或任何其他编程语言快速完成插入操作。
话虽这么说,如果你发现自己经常这样做,那么ETL工具可能值得学习。
答案 3 :(得分:0)
我自己正在开展一个类似的项目 - 将数据从包含几十个表的一个模型迁移到类似数量的表的不同模型。
我采用了为每个目标表创建MERGE语句的方法。源查询获取它需要的所有数据,根据需要对其进行格式化,然后如果行已存在并且根据需要更新/插入,则合并将成功。这样,我可以在开发解决方案时多次运行该语句。
答案 4 :(得分:0)
取决于转化过程的复杂程度。如果很容易在单个SQL语句中表达,那么你们都已经设置好了;只需创建SELECT语句,然后执行CREATE TABLE / INSERT语句。但是,如果您需要执行一些复杂的转换或(颤抖)拆分或合并任何行以正确转换它们,您应该使用流水线表函数。但是,听起来并非如此;尝试坚持上面提到的另一个克里斯建议的单一陈述。你确实不想要从数据库中提取数据来进行转换,因为进出Oracle的传输总是慢于将数据保存在数据库中。
还有一些提示: