2016-10-25 16 views
1

同じテーブルの別のレコードを使用して、テーブル内の2つのカラムを更新しようとしています。以下は私が思いついた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'; 

答えて

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' 
0

ROW_IDがATTの主キーであるとT_ACTIVITYA__RIDはあなたがアップデート(選択...)他の回答に加えて

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

、あなたを書くことROW_IDを参照してIFTBLに外部キーである場合単純に複数列の更新を行うことができます:

​​
関連する問題