Sql 从Oracle中的另一个表更新表上的键

Sql 从Oracle中的另一个表更新表上的键,sql,oracle,Sql,Oracle,当键值为abc时,我试图通过从表t2获取值来更新表t1上的键 当我把它限制在一个特定的人身上时,它就像预期的那样工作 update table_a t1 set t1.u_key = (select t2.u_key from table_b t2 where t2.name_f=t1.name_f and t2.name_l=t1.name_l

当键值为abc时,我试图通过从表t2获取值来更新表t1上的键

当我把它限制在一个特定的人身上时,它就像预期的那样工作

update table_a t1
   set t1.u_key = (select t2.u_key 
                   from table_b t2 
                   where t2.name_f=t1.name_f 
                     and t2.name_l=t1.name_l 
                     and rownum<=1 
                     and t2='NEVADA')
where t1.u_key = 'abc'
and e.name_f='Lori' 
and e.name_l='U'
;
我最初尝试不使用rownum,结果显示返回的行太多

为了使用t1.u_key='abc'在所有数据上运行并去掉特定的名称,我尝试了这个一直运行到超时的方法

update table_a t1
   set t1.u_key = (select t2.u_key 
                   from table_b t2 
                   where t2.name_f=t1.name_f 
                     and t2.name_l=t1.name_l 
                     and rownum<=1 
                     and t2='NEVADA')
where t1.u_key = 'abc'
;

请看一看,并提出我遗漏了什么。

您应该先看一下单独运行内部SELECT语句时返回的内容:

SELECT t2.u_key FROM table_b t2 
WHERE t2.name_f IN (SELECT name_f FROM table_a WHERE u_key = 'abc') 
AND t2.name_l IN (SELECT name_l FROM table_a WHERE u_key = 'abc') 
AND t2='NEVADA'
检查结果,您将看到返回的行不止一行

如果每个键只有匹配的行,那么您也需要将该键添加到内部SELECT,但如果没有其他表说明以及表a和表b中的一些示例条目,我无法告诉您它的外观。

使用以下方法:

update     ( 
             SELECT t2.u_key t2key,
                    t1.ukey t1key
              FROM table_b t2,
                   table_a t1
              where t2.name_f=t1.name_f 
              and t2.name_l=t1.name_l                
              and t2='NEVADA'
              and rownum<=1 )
SET     t1key =     t2key
where   t1key = 'abc';   

@JuanCarlosOropeza,感谢您修复我答案中的复制/粘贴错误!嗯,你可能有两个人的名字和姓氏都一样。在我的情况下,我的名字和我爸爸胡安·奥罗佩扎的名字一样,他甚至可以用他的卡号大加号从我这里取回邮件包,小加号是当我妈妈打电话或电话铃响的时候,你必须问爸爸或儿子。谢谢@Hambone,我向数据专家确认了,他们建议我可以使用另一个可以一对一匹配的领域。@Juan Carlos Oropeza,非常感谢。这就清楚了。我现在有另一个专栏,一对一。
merge into table_a t1
 using(
       select name_f, name_l, max(u_key) as new_key
         from table_b t2 
        where t2='NEVADA'
        group by name_f, name_l
      ) t2
   on (t1.name_f=t2.name_f and t1.name_l=t2.name_l and t1.u_key='abc')
 when matched then
  update set t1.u_key=t2.new_key