2012-05-08 3 views
2

背景:私のチームには、集計テーブルを更新するetlジョブがあります。各行には特定の日付のデータが含まれていますが、この行は行の日付の後に更新されます(行には複数のジョブのデータが含まれる可能性があります)。このETLジョブは先週1日分のデータを欠落していましたが、これをバックフィルする必要があります。新しいテーブルを作成せずにテーブルを更新する/挿入する方法(一時的またはそれ以外)

問題:欠落しているデータがあり、私がやっていることは、そのデータを一時テーブルにダンプし、それをaggテーブルとマージすることでした。そのようにして、ETLジョブにすでにそのデータの行(更新)が含まれているか、新しい行を追加する必要があるか(挿入)、一時表を作成するための十分な権限がないかどうか、 DBAに関与しないことをお勧めします。

質問:一時的なテーブルを作成せずに挿入/更新の種類の動作を行うことはできますか(これはOracle SQLです)。

編集:データはtsvファイルから送信されています。

+0

データはどこですか? –

+0

欠けているデータはどこにありますか?それはテーブルとしてオラクルにありますか?あるいは、それはある種のスプレッドシートまたは外部データベースにありますか?あなたの質問が正しく理解され、データが外部データベースにあると仮定すると、実現する各行に対してデュアルとの組み合わせを使用してデータをOracleに「実体化」しなければならないと思います。デュアルユニオンから2を2、デュアルからすべてを選択3、4を選択してください。前のsqlを外部のデータベースを介して生成できるはずです。 – Sumit

+0

データは実際にはtsvファイルからのものです。 – user467384

答えて

2

なぜDBAの関与を避けたいですか? DBAは、データベース内のデータの状態に最終的に責任を負うため、データベース内で何が起こっているのかを完全に把握している必要があります。だからあなたは彼らと卑劣な戦闘をしてはいけません。

データが不足しているので、データベースに表示する最も簡単な方法はan external tableです。これには、テーブルとおそらくディレクトリオブジェクトの作成も必要です。この作業にはDBAのヘルプが必要です。

データベースオブジェクトの作成を避ける唯一の方法は、TSVファイルを一連のDML文に変換することです。正規表現やレコードマクロをサポートするIDEはここでは非常に重要です。私はTextPadが好きです。他のエディタも利用可能です。

Oracleでupsertsを実行するためのDML文は、the MERGE statementです。あなたが見る必要があることの1つは、最新性です。欠落したデータは先週からのものです。行が存在する場合は、その間にが追加または修正された可能性があります。最近のデータを古いもので上書きしないように、MERGE文を書く必要があります。あなたのテーブルには、DATE_CREATEDやLAST_UPDATEDなどの有用なメタデータ列があるといいでしょう。

関連する問題