|
|
Re: Oracle Update to get data from other tables using join [message #685819 is a reply to message #685815] |
Fri, 01 April 2022 07:10  |
Solomon Yakobson
Messages: 3214 Registered: January 2010 Location: Connecticut, USA
|
Senior Member |
|
|
Looks like you come from SQL Server background. Oracle UPDATE syntax is different. But before we go there look at:
TO_DATE(add_months(rec.dis_real_date, -12* dis.retention_period))
add_months returns DATE data type, TO_DATE expects string, therefore add_months result will be implicitly converted to string using session NLS_DATE_FORMAT and then back to data, again, using session NLS_DATE_FORMAT. So if, for example, NLS_DATE_FORMAT=DD-MON-RR you will lose time portion. So get rid of TO_DATE, all you need is
add_months(rec.dis_real_date, -12* dis.retention_period)
Now back to syntax:
UPDATE record rec
SET rec.END_DATE = (
SELECT add_months(rec.dis_real_date, -12* dis.retention_period)
FROM component cpt
JOIN
klass kla
ON rec.kla_id = kla.kla_id
LEFT JOIN
disposition_schedule dis
ON kla.dis_id = dis.dis_id
WHERE rec.rec_id = cpt.rec_id
)
WHERE rec.label IN (
'201203876',
'199831956',
'201203699'
'198521677'
)
AND rec.rec_id IN (
SELECT cpt.rec_id
FROM component cpt
);
Using MERGE would be more readable. Assuming rec_id is unique:
MERGE
INTO record t
USING (
SELECT rec.rec_id
add_months(rec.dis_real_date, -12* dis.retention_period) end_date
FROM record rec
JOIN
component cpt
ON rec.rec_id = cpt.rec_id
JOIN
klass kla
ON rec.kla_id = kla.kla_id
LEFT JOIN
disposition_schedule dis
ON kla.dis_id = dis.dis_id
WHERE rec.label IN (
'201203876',
'199831956',
'201203699'
'198521677')
) s
ON (
t.rec_id = s.rec_id
)
WHEN MATCHED
THEN
SET t.end_date = s.end_date
/
And if rec_id isn't unique
MERGE
INTO record t
USING (
SELECT rec.rowid rid
add_months(rec.dis_real_date, -12* dis.retention_period) end_date
FROM record rec
JOIN
component cpt
ON rec.rec_id = cpt.rec_id
JOIN
klass kla
ON rec.kla_id = kla.kla_id
LEFT JOIN
disposition_schedule dis
ON kla.dis_id = dis.dis_id
WHERE rec.label IN (
'201203876',
'199831956',
'201203699'
'198521677')
) s
ON (
t.rowid = s.rid
)
WHEN MATCHED
THEN
SET t.end_date = s.end_date
/
SY.
|
|
|