我在linux中有一个文件,该文件类似于: (我有数百万行)
date number name id state
20131110 1089 name1 123 start
20131110 1080 name2 122 start
20131110 1082 name3 121 start
20131114 1089 name1 120 end
20131115 1082 name3 119 end
我在Oracle中有一个表,其中包含以下文件:
init_table
start_date
end_date
number
name
id
问题是我读到我可以插入带有sqlloader
的数据,(我有数百万行,然后创建一个时间表来插入,稍后用触发器更新,另一个表不是很好)问题是我有一个开始日期为X的用户,例如数字1089的开始日期为:20131110,该用户的end_date为:20131114,然后我需要先在我的表中插入start_date,之后当我找到end_date,更新我插入的数字表,在我的例子中是1089,结束日期是:20131114。
如何使用ctl或其他东西。
谁能帮助我。感谢
答案 0 :(得分:2)
什么版本的Oracle?
我会使用外部表。定义与您的平面文件完全匹配的外部表。然后,您应该能够通过两次传递,一次插入,一次更新来解决这个问题。
这样的事情应该这样做:
insert into init_table select to_date(date,'YYYYMMDD'),null,number,name,id from external_table where state='start';
update init_table set end_date=(select date from external_table where state='end' and init_table.number=external_table.number);
请注意,您实际上不能拥有名为“date”或“number”的列,因此,上面的sql实际上并不像写入的那样工作。您必须更改这些列名称。
希望有帮助...
答案 1 :(得分:1)
$ cat sqlldrNew.ctl load data infile '/home/Sameer/employee.txt' into table employee fields terminated by X'9' ( date, -->select number from employee where name=[Name from the file record], name, id, state ) $ sqlldr scott/tiger control=/home/Sameer/sqlldrNew.ctl
我认为这应该有用。
答案 2 :(得分:1)
如果使用外部表方法,则可以将外部表中的数据连接到自身,以生成可以插入的单个记录。虽然连接很昂贵,但总的来说它应该是一个有效的过程,只要我期望使用的散列连接保留在内存中。
就像......
insert into init_table (
start_date,
end_date,
number,
name,
id)
select
s.date,
e.date,
s.number,
s.name,
s.id
from external_table s
join external_table e on s.number = e.number
where
s.state = 'start' and
e.state = 'end'
假设每个开始日期总会有一个结束日期,并且该表中的数字不存在 - 如果其中任何一个条件不成立,那么在前一种情况下将需要外连接,以及后者需要合并。