我尝试使用同一个表中的另一条记录更新表中的几列。以下是我提出的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';
答案 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';