2016-10-14 22 views
1

テーブル(t2)から値を取得して、キー値が(abc)のときにテーブルのキー(t1)を更新しようとしています。私が私が最初にROWNUMせずにしようと、それはあまりにも多くの行が返さ言っ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' 
; 

特定の人にそれを制限していたときに期待どおりに動作している

すべてのデータを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'を持つ2人の人を持っています。私の場合、私のお父さんJuan Oropezaと同じ名前を持っています。彼は自分のカードID「ビッグプラス」を使って私からメールパッケージを取り戻すことさえできます。ダウンサイズは、お母さんが電話をかけるとき、またはお父さんや息子。 –

+0

ありがとう@Hambone、私はデータの専門家と確認し、彼らは私が1対1に一致することができる別のフィールドを使用できることを示唆した。 –

答えて

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_aおよびtable_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 
関連する問題