Вы не так уж далеки, но ваш подзапрос не коррелирован - нет никакой связи между значениями, которые находит подзапрос, и строкой, которая обновляется, поэтому вы, вероятно, получаете ошибку ORA-01427. Но вам не нужен подзапрос, так как вы обновляете ту же строку:
update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3);
Вы можете сделать это и без регулярного выражения:
update table_name set varname = substr(varname, instr(varname, '-', -1) + 1);
, что также имеет то преимущество, что не обнуляет строки, которые не являются ожидаемым шаблоном. Тем не менее, вы можете уменьшить ненужную работу, обновляя значения только тире:
update table_name set varname = substr(varname, instr(varname, '-', -1) + 1)
where instr(varname, '-', -1) > 0;
или
update table_name set varname = regexp_substr(varname, '[^-]+', 1, 3)
where regexp_substr(varname, '[^-]+', 1, 3) is not null;
, который будет обновлять только те строки, в которых старое значение имеет (как минимум) три элемента.
Два обновления будут вести себя по-разному, если есть два элемента - первый с substr/instr
всегда будет занимать последнюю часть после тире, если они есть; Второй с rexexp_substr
не будет обновлять один с тире. Вы показали только один фиксированный шаблон, поэтому ни один из них не может иметь отношение к вам. По крайней мере, пока вы снова не запустите то же самое обновление для этих данных ...