避免多个子查询

时间:2016-10-25 05:29:33

标签: sql oracle

我尝试使用同一个表中的另一条记录更新表中的几列。以下是我提出的SQL,但我想知道如何避免多个将返回相同记录的子查询。我正在使用 Oracle 11gR2

UPDATE
  IFTBL E
SET
  E.ATT_CREATED = (SELECT A.CREATED FROM ATT A WHERE A.ROW_ID = E.T_ACTIVITYA__RID),
  E.ATT_CREATED_BY = (SELECT B.CREATED_BY FROM ATT B WHERE B.ROW_ID = E.T_ACTIVITYA__RID)
WHERE
  E.IF_ROW_BATCH_NUM = BATCH_NO_IN AND E.IF_ROW_STAT = 'EXPORTED' AND E.ATT_FILE_SRC_TYPE = 'FILE';

3 个答案:

答案 0 :(得分:1)

您可以使用合并。

    MERGE INTO IFTBL 
    USING 
    (
      SELECT CREATED,CREATED_BY,ROW_ID 
      FROM ATT 
    ) A ON (A.ROW_ID = IFTBL.T_ACTIVITYA__RID)
    WHEN MATCHED THEN UPDATE 
        SET 
        IFTBL.ATT_CREATED = A.CREATED, 
        IFTBL.ATT_CREATED_BY = A.CREATED_BY
    WHERE
    IFTBL.IF_ROW_BATCH_NUM = BATCH_NO_IN 
    AND IFTBL.IF_ROW_STAT = 'EXPORTED' 
    AND IFTBL.ATT_FILE_SRC_TYPE = 'FILE'

答案 1 :(得分:0)

如果ROW_ID是ATT中的主键而T_ACTIVITYA__RID是IFTBL上的外键并且引用了ROW_ID,则可以写更新(选择...)

update (select E.ATT_CREATED, E.ATT_CREATED_BY  
               A.CREATED , A.CREATED_BY 
          from IFTBL E, ATT A 
         where E.T_ACTIVITYA__RID = A.ROW_ID(+)
           AND E.IF_ROW_BATCH_NUM = BATCH_NO_IN 
           AND E.IF_ROW_STAT = 'EXPORTED' 
           AND E.ATT_FILE_SRC_TYPE = 'FILE')
SET ATT_CREATED = CREATED, 
    ATT_CREATED_BY = CREATED_BY ;

答案 2 :(得分:0)

除了其他答案之外,您只需进行多列更新:

UPDATE
  IFTBL E
SET
  (E.ATT_CREATED, E.ATT_CREATED_BY) = (SELECT A.CREATED,
                                              A.CREATED_BY
                                       FROM   ATT A
                                       WHERE  A.ROW_ID = E.T_ACTIVITYA__RID)
WHERE
  E.IF_ROW_BATCH_NUM = BATCH_NO_IN
  AND E.IF_ROW_STAT = 'EXPORTED'
  AND E.ATT_FILE_SRC_TYPE = 'FILE';
相关问题