2016-12-14 11 views
1

マージするために変換が非常に遅い以下の更新ステートメントがあります。私は次のステートメントをマージするステートメントを変更しようとしています。任意の提案マージするために自己結合アップデートを変換する

UPDATE CLASS CL 
SET (PARENT_CLS_TITLE, 
PARENT_SECTION_FLAG, 
PARENT_ACADEMIC_CODE, 
PARENT_CLASS_FL 
) = 
(select 
PARENT.CLASS_TITLE PARENT_CLASS_TITLE 
,PARENT.SECTION_FLAG PARENT_SECTION_FLAG 
,PARENT.ACADEMIC_CODE PARENT_ACADEMIC_CODE 
,PARENT.CLASS_FL PARENT_CLASS_FL 
from CLASS CHILD 
, CLASS PARENT 
where CHILD.PARENT_TERM_NUMBER = PARENT.TERM_CODE || '|' ||PARENT.CLASS_NUMBER 
AND CL.CRSE_ID=CHILD.CRSE_ID 
AND CL.CRSE_OFFER_NUM=CHILD.CRSE_OFFER_NUM 
AND CL.TERM_CODE=CHILD.TERM_CODE 
AND CL.SESSION_CODE=CHILD.SESSION_CODE 
AND CL.CLS_SECTION_CODE=CHILD.CLS_SECTION_CODE) 

テーブルの定義とインデックス。これは私が私が正しくロジックをたどることができたことを確認していないいない他の制約など

CREATE TABLE CLASS 
    (
    CRSE_ID VARCHAR2(255), 
    CRSE_OFFER_NUM VARCHAR2(255), 
    TERM_CODE VARCHAR2(255), 
    SESSION_CODE VARCHAR2(255), 
    CLS_SECTION_CODE VARCHAR2(255), 
    CLASS_NUMBER VARCHAR2(255), 
    PARENT_TERM_NUMBER VARCHAR2(255), 
    CLASS_TITLE VARCHAR2(255), 
    SECTION_FLAG VARCHAR2(1), 
    ACADEMIC_CODE VARCHAR2(255), 
    CLASS_FL  VARCHAR2(1), 
    PARENT_CLS_TITLE VARCHAR2(255), 
    PARENT_SECTION_FLAG VARCHAR2(1), 
    PARENT_ACADEMIC_CODE VARCHAR2(255), 
    PARENT_CLASS_FL VARCHAR2(1) 
); 

    CREATE UNIQUE INDEX IDX_CLASS ON CLASS 
    (CRSE_ID, CRSE_OFFER_NUM, TERM_CODE, SESSION_CODE, CLS_SECTION_CODE); 
+0

質問を編集し、すべてのデータ型、キー(プライマリ、ユニーク、および外部)とインデックスを含むCLASSテーブルの定義を含めてください。ありがとう。 –

+0

そして、ボブの質問に対する答えに応じて、MERGEステートメントが必要ない場合もあります(ただし、この種の問題にはMERGEが最適な選択です)。たとえば、結合を介して直接テーブルを更新することができます。可能な場合には、MERGE over UPDATEを使用しなくても、時間を節約できます。 (しかし、これはCLASSテーブルでどのようなキーを使用するかによって異なります) – mathguy

+0

私はtoadからスクリプトを提供しました。これを見ていただきありがとうございます。そのテーブルには多くの行があり、更新は永遠に実行されています。 – user1751356

答えて

0

テーブルの上だけのものが存在しているが、私は以下の文は、あなたのオリジナルのものと論理的に等価であると考えています。試してみてください。

UPDATE CLASS CL 
SET (PARENT_CLS_TITLE , 
     PARENT_SECTION_FLAG , 
     PARENT_ACADEMIC_CODE, 
     PARENT_CLASS_FL 
    ) = 
    (select CLASS_TITLE , 
      SECTION_FLAG , 
      ACADEMIC_CODE, 
      CLASS_FL 
     from CLASS 
     where CL.PARENT_TERM_NUMBER = TERM_CODE || '|' || CLASS_NUMBER 
    ) 
; 

投稿した内容は、サブクエリが単一の行を返すことを保証するものではありません。複数の行が返された場合、更新は失敗します。これは、元のステートメントでも当てはまりました。データ内では、サブクエリが1行しか返さない可能性があります。つまり、提示した情報に必ずしも従わないということです。

関連する問題