2017-03-21 9 views
0

別のテーブルからデータを取り込んで、一致するC、I値に合わせてTOCTASKを設定するスクリプトに3つの更新ステートメントがあります。1つの更新ステートメントでX個の更新ステートメントを結合する

TOCTASKが大きく、各ステートメントの実行に時間がかかる、私は思っていた。これは、Oracleデータベース上で実行されます

1つの全体の更新ステートメントに3文をcombindingの方法があります

更新ステートメントの

例:

UPDATE TOCTASK 
SET TOCTASK.COL1 = 
    (SELECT VM_TEMP_TOCTASK.COL1 
    FROM VM_TEMP_TOCTASK 
    WHERE VM_TEMP_TOCTASK.C = TOCTASK.C 
    AND VM_TEMP_TOCTASK.I = TOCTASK.I 
); 


UPDATE TOCTASK 
SET TOCTASK.COL2 = 
    (SELECT VM_TEMP_TOCTASK.COL2 
    FROM VM_TEMP_TOCTASK 
    WHERE VM_TEMP_TOCTASK.C = TOCTASK.C 
    AND VM_TEMP_TOCTASK.I = TOCTASK.I 
); 


UPDATE TOCTASK 
SET TOCTASK.COL3 = 
    (SELECT VM_TEMP_TOCTASK.COL3 
    FROM VM_TEMP_TOCTASK 
    WHERE VM_TEMP_TOCTASK.C = TOCTASK.C 
    AND VM_TEMP_TOCTASK.I = TOCTASK.I 
); 

は、すべてのヘルプは素晴らしいことだ

答えて

2

一度に全体のタプルを設定することができます。VM_TEMP_TOCTASK(C, I)上のインデックスは、おそらく、パフォーマンスを助けるだろうと

UPDATE TOCTASK 
    SET (COL1, COL2, COL3) = 
     (SELECT tt.COL1, tt.COL2, tt.COL3 
      FROM VM_TEMP_TOCTASK tt 
      WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I 
     ); 

注意を。

そして、このコードは一致しない値をNULLに設定します。多くの場合、このような副問合せはEXISTSと組み合わせて使用​​されます。col1とcol3というデータがあったが、col2には、そのレコードにヌルだったと言う場合

UPDATE TOCTASK 
    SET (COL1, COL2, COL3) = 
     (SELECT tt.COL1, tt.COL2, tt.COL3 
      FROM VM_TEMP_TOCTASK tt 
      WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I 
     ); 
    WHERE EXISTS (SELECT 1 
        FROM VM_TEMP_TOCTASK tt 
        WHERE tt.C = TOCTASK.C AND tt.I = TOCTASK.I 
       ); 
+0

ちょうど、上記のコードを不思議。何が起こるでしょうか? – Jamiex304

+0

@ Jamiex304。 。 。 'col2'が' NULL'だった場合、 'TOCTASK'では' NULL'に設定されます。 'col2'は一致条件の一部ではないので、行はまだ一致します。 –

+0

フォローアップありがとう – Jamiex304

関連する問題