2016-10-14 84 views
1

我試圖通過從表(t2)中獲取值來更新表(t1)上的密鑰值爲(abc)時的密鑰。在Oracle中從另一個表更新表上的密鑰

它工作時,我將其限制在一個特定的人

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' 
; 

你可以看看它,並建議我錯過了什麼。

+0

ROWNUM <= 1似乎有點武斷......是不是有一個定義決勝,你可以用它來確定所需的記錄返回(更新)時有多重? – Hambone

+1

那麼你可能有兩個人具有相同的'first_name'和'last_name'。在我的情況下,我的姓名與我父親胡安奧羅佩薩相同,他甚至可以使用他的身份證ID「big plus」從我身上取回郵件包,當我媽媽打來電話或電話響時,您必須問父親或兒子。 –

+0

Thanks @Hambone,我向數據專家證實,他們建議我可以使用另一個可以匹配的字段。 –

回答

1

你應該先看看,當你單獨運行的內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中,但是我無法告訴您應該如何在沒有附加表格描述的情況下以及可能從table_atable_b

+0

@JuanCarlosOropeza,感謝您解決我的答案中的複製/粘貼錯誤! – SaschaM78

0

使用此:

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'; 
0
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