2

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や他のものでそれを行うことができますか.

誰が私を助けることができます。ありがとう

4

3 に答える 3

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'

これは、開始日ごとに終了日が常に存在し、番号がテーブルにまだ存在しないことを前提としています。これらの条件のいずれかが真でない場合、前者の場合は外部結合が必要になります。後者ではマージが必要です。

于 2013-11-15T16:48:52.380 に答える
1
$ 猫 sqlldrNew.ctl

データを読み込む
 infile '/home/Sameer/employee.txt'
 テーブルの従業員に
 X'9' で終了するフィールド
 ( date, --> select number from employee where name=[Name from the file record], name, id, state )

$ sqlldr スコット/タイガー コントロール=/home/Sameer/sqlldrNew.ctl

これはうまくいくはずだと思います。

于 2013-11-15T15:42:03.363 に答える