Ваш запрос работает, он просто не соответствует желаемому.
На основании вашего вопроса (не ваших выборочных данных, которые, кажется, не соответствуют вашим требованиям), я собрал это внадеюсь, вы укажете правильное направление
create table tablea(data1 varchar2(8) , data2 varchar2(8), data3 varchar2(8) );
create table tableb(data1 varchar2(8) , data2 varchar2(8) );
insert into tablea values('Val2',null,'Val3');
insert into tablea values(null,'ValB','Val3');
insert into tableB values('Value1','ValB');
insert into tableB values('NewValue','Val2');
update TableA
set Data1 = nvl((Select B.Data1
from TableB B --no need for join, I believe you want to join to the 'updating table'
where /*TableA.Data1=B.Data2
and B.Data2 is null*/ -- this won't work, null DOES NOT EQUAL NULL
TableA.Data1=B.Data2
) ,TableA.Data1) --this way, if no data is returned from tableB.data1 to tableA join we will retain tableA.Data1 value
where Data3='Val3' ;
select * from tableA;
DATA1 DATA2 DATA3
-------- -------- --------
NewValue Val3
ValB Val3
пожалуйста, посмотрите на начальные вопросы относительно ваших вопросов, ваше предложение WHERE (и присоединение) делает так, чтобы все не работало