Du kan bruge en with-klausul i en opdatering; du skal bare gøre det det rigtige sted:
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);
Du vil dog sandsynligvis kun opdatere rækker, der findes i den midlertidige underforespørgsel, så du skal bruge en ekstra where-klausul:
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);
Alternativt kan du bruge en MERGE-sætning:
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;
N.B. du skal slutte dig til den faktiske tabel i kildeforespørgslen til flettesætningen, fordi du forsøger at opdatere den kolonne, der sammenføjes på, hvilket du ikke kan gøre i en flettesætning - derfor har jeg ændret flettesammenføjningen til deltag på mytable.rowid.
Du skal teste begge udsagn for at se, hvilken der er mest effektiv på dine data.