Możesz użyć klauzuli with w aktualizacji; po prostu musisz to zrobić we właściwym miejscu:
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);
Jednak prawdopodobnie chcesz aktualizować tylko te wiersze, które istnieją w podzapytaniu tymczasowym, więc będziesz potrzebować dodatkowej klauzuli where:
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);
Alternatywnie użyj instrukcji MERGE:
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;
Uwaga musisz dołączyć do rzeczywistej tabeli w zapytaniu źródłowym instrukcji scalania, ponieważ próbujesz zaktualizować kolumnę, na której jest łączona, czego nie możesz zrobić w instrukcji scalania - dlatego przestawiłem łączenie scalające na dołącz do mytable.rowid.
Musisz przetestować oba stwierdzenia, aby zobaczyć, które z nich jest najskuteczniejsze w przypadku Twoich danych.