将自加入更新转换为合并

时间:2016-12-14 20:13:50

标签: sql oracle merge

我有以下更新语句,执行速度非常慢,无法转换为合并。我正在尝试将以下语句更改为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);

1 个答案:

答案 0 :(得分: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
    )
;

当然,您发布的内容并不能保证子查询返回单行。如果它返回多行,则更新将失败。 (对于你的原始陈述也是如此。)也许在你的数据中,子查询只返回一行 - 只是它不一定跟你所提供的信息一致。