Bạn có thể sử dụng mệnh đề with trong một bản cập nhật; bạn chỉ cần làm điều đó ở đúng nơi:
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);
Tuy nhiên, có thể bạn chỉ muốn cập nhật các hàng tồn tại trong truy vấn con tạm thời, vì vậy bạn sẽ cần thêm mệnh đề 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);
Ngoài ra, hãy sử dụng câu lệnh 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. bạn phải tham gia vào bảng thực tế trong truy vấn nguồn của câu lệnh hợp nhất vì bạn đang cố cập nhật cột đang được kết hợp, điều mà bạn không thể thực hiện trong một câu lệnh hợp nhất - do đó tôi đã chuyển phép kết hợp thành tham gia trên mytable.rowid.
Bạn sẽ phải kiểm tra cả hai câu lệnh để xem câu lệnh nào hoạt động tốt nhất trên dữ liệu của bạn.