Reputation: 11
I'm trying to update a couple of columns in a table using another record in the same table. Following is the SQL that I came up with but I'm wondering how I can avoid multiple sub queries that will return the same record. I'm working on 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';
Upvotes: 1
Views: 82
Reputation: 23578
In addition to the other answers, you could simply do a multi-column update:
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';
Upvotes: 0
Reputation: 1997
If ROW_ID is primary key in ATT
and T_ACTIVITYA__RID is foreign key on IFTBL
with reference to ROW_ID you may write update (select ...)
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 ;
Upvotes: 0
Reputation: 1912
You can use Merge.
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'
Upvotes: 1