2016-12-14 2 views
1

У меня есть инструкция обновления, которая выполняется очень медленно, чтобы преобразовать ее в слияние. Я пытаюсь изменить инструкцию ниже для слияния. любые предложенияconvert self joining update to 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) 

Определение и индекс на столе. Это единственный материал присутствует на столе никаких других ограничений и т.д.

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 над UPDATE. (Но, опять же, это зависит от того, какие ключи у вас могут быть в таблице CLASS.) – mathguy

+0

Я предоставил скрипт из жабы. Спасибо, что посмотрели на это. В этой таблице много строк, и обновление выполняется навсегда. – 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 
    ) 
; 

Конечно, то, что вы отправили, не гарантирует, что подзапрос возвращает одну строку. Если он возвращает более одной строки, обновление завершится неудачно. (Это было верно и для вашего исходного утверждения.) Возможно, в ваших данных верно, что в подзапросе возвращается только одна строка - это просто, что она не обязательно вытекает из информации, которую вы представили.