Anda dapat menggunakan klausa with dalam pembaruan; Anda hanya perlu melakukannya di tempat yang tepat:
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);
Namun, Anda mungkin hanya ingin memperbarui baris yang ada di subkueri temp, jadi Anda memerlukan klausa where tambahan:
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);
Atau, gunakan pernyataan 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;
N.B. Anda harus bergabung ke tabel aktual dalam kueri sumber dari pernyataan gabungan karena Anda mencoba memperbarui kolom yang sedang digabungkan, yang tidak dapat Anda lakukan dalam pernyataan gabungan - oleh karena itu saya telah mengalihkan gabungan gabungan ke bergabung di mytable.rowid.
Anda harus menguji kedua pernyataan untuk melihat mana yang paling berkinerja pada data Anda.