2016-12-14 2 views
1

Ich habe unter Update-Anweisung, die sehr langsam ist, um in Merge konvertiert werden. Ich versuche, die folgende Anweisung zu ändern, um die Anweisung zusammenzuführen. alle VorschlägeConvert Self Beitritt Update zu Merge

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) 

Definition und Index auf dem Tisch. Dies ist das einzige Material auf dem Tisch vorhanden keine andere Einschränkungen etc

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

Bearbeiten Sie Ihre Frage und fügen Sie die Definition der CLASS-Tabelle hinzu, einschließlich aller Datentypen, Schlüssel (primär, eindeutig und fremd) und Indizes. Vielen Dank. –

+0

Und abhängig von der Antwort auf Bobs Frage ist es möglich, dass Sie keine MERGE-Anweisung benötigen (obwohl MERGE für diese Art von Problem oft die beste Wahl ist). Sie können beispielsweise Ihre Tabelle direkt über den Join aktualisieren. Die Zeitersparnis wird, wenn überhaupt möglich, durch das Umschreiben der Anweisung erreicht, nicht notwendigerweise durch die Verwendung von MERGE over UPDATE. (Aber, wieder, das hängt davon ab, welche Schlüssel Sie in der Tabelle CLASS haben können.) – mathguy

+0

Ich habe das Skript von Kröte zur Verfügung gestellt. Danke, dass du dir das angeschaut hast. Diese Tabelle hat viele Zeilen und das Update wird für immer ausgeführt. – user1751356

Antwort

0

Ich bin nicht sicher, ob ich in der Lage war, die Logik richtig zu folgen, aber ich glaube, die Erklärung unten an deinen ursprünglichen logisch äquivalent ist. Probieren Sie es aus und lassen Sie es uns wissen.

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 
    ) 
; 

Natürlich, was Sie gebucht haben, garantiert nicht, dass die Unterabfrage eine einzelne Zeile zurückgibt. Wenn mehr als eine Zeile zurückgegeben wird, schlägt die Aktualisierung fehl. (Dies galt auch für Ihre ursprüngliche Aussage.) Vielleicht ist es in Ihren Daten richtig, dass die Unterabfrage nur eine Zeile zurückgibt - es folgt lediglich, dass sie nicht notwendigerweise aus den von Ihnen dargestellten Informationen folgt.