2012-05-04 8 views
0

Oracleでは2つのテーブルがあります。両方ともデータが入力され、timestampの列を持ちます。一致するテーブルのデータを使用して、別のテーブルのID一致に基づいて1つのテーブルに列データを設定する方法

テーブルの1つにデータが格納されており、もう1つのテーブルにはデータが格納されていません。しかし、私は別の列の一致に基づいて、他のテーブルの列に行うテーブルからデータを取得する必要があります。

それぞれに 'コード'があるので、あるテーブルのタイムスタンプは、コードが一致する他のテーブルのタイムスタンプに入れるだけです。

私はカーソルなどを試しましたが、何か不足しているようです。

提案がありますか?

+0

'主キーまたは一意のcode'ですソーステーブルの列? – Neil

+0

それはプライマリキーではなく、ヌル可能です。ユニークではないと確信しています – 1Canuck16

+0

2つのコードが一致したらどうしますか? – Neil

答えて

2

相関更新が必要なようです。これにより、destinationTableのすべての行が(sourceTable)から更新され、code列に一致するものが更新されます。

UPDATE destinationTable d 
    SET timestamp_col = (SELECT s.timestamp_col 
          FROM sourceTable s 
         WHERE s.code = d.code) 
WHERE EXISTS(SELECT 1 
       FROM sourceTable s 
       WHERE s.code = d.code) 
+2

これは、コード列に重複が含まれる可能性があるため、おそらく失敗します(質問へのコメントを参照)。サブセレクトに 'max(s.timestamp_col) 'などが必要です。 –

+0

これは行く方法と思われますが、約3000万行を処理していますので、最初にスピードを上げるためにいくつかのことをやっていきます。あなたは他に何か提案しますか? – 1Canuck16

+1

@redBarron - 単一のUPDATE文が、多数の行を更新する最も効率的な方法になります。 @Neilと@a_horse_with_no_nameが指摘しているように、同じ 'code'を持つ複数の行がある場合は、ソーステーブルのどの行を使用して宛先の特定の行を更新するのかを判断するための追加基準を指定する必要がありますテーブル(おそらく 'max(s.timestamp_col)'で)。 –

1

ただ、完全を期すために、私は先が主キーまたは一意の列を持っている場合、私は、(未テスト)このような何かをやっているだろうと思う:

UPDATE (
    SELECT d.primary_key AS pk, d.timestamp_col AS dest_col, MAX(s.timestamp_col) AS src_col 
    FROM dest d 
    JOIN src s ON d.code = s.code 
    GROUP BY pk, dest_col 
) j 
    SET j.dest_col = j.src_col 
関連する問題