U kunt een with-clausule gebruiken in een update; je hoeft het alleen maar op de juiste plaats te doen:
UPDATE mytable
SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
(SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
)
SELECT newvalue
FROM temp
WHERE mytable.name = temp.oldvalue);
U wilt echter waarschijnlijk alleen de rijen bijwerken die in de tijdelijke subquery bestaan, dus u hebt een extra where-clausule nodig:
UPDATE mytable
SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
(SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
)
SELECT newvalue
FROM temp
WHERE mytable.name = temp.oldvalue)
WHERE EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
(SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
)
SELECT NULL
FROM temp
WHERE mytable.name = temp.oldvalue);
U kunt ook een MERGE-instructie gebruiken:
merge into mytable tgt
using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
(SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
)
SELECT mytable.rowid r_id,
temp.newvalue
FROM temp
inner join mytable on mytable.name = temp.oldvalue) src
on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;
NB je moet deelnemen aan de eigenlijke tabel in de bronquery van de samenvoeginstructie omdat je probeert de kolom bij te werken waaraan wordt toegevoegd, wat je niet kunt doen in een samenvoeginstructie - daarom heb ik de samenvoeging overgeschakeld naar doe mee op mytable.rowid.
U zou beide verklaringen moeten testen om te zien welke het meest presteert op uw gegevens.