2016-10-14 3 views
1

Я пытаюсь обновить ключ в таблице (t1), когда значение ключа (abc), получив значение из таблицы (t2).Обновление ключа из таблицы из другой таблицы в 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». В моем случае у меня есть то же имя, что и мой папа 'Хуан Оропеза', он даже может получить от меня почтовые пакеты, используя свой идентификатор карты« большой плюс », размер вниз, когда моя мама звонит или звонит по телефону, вы должны попросить отца или сын. –

+0

Спасибо @ Хамбоне, я подтвердил экспертом по данным, и они предложили, чтобы я мог использовать другое поле, которое может соответствовать одному на одном. –

ответ

1

Вы должны сначала посмотрим, что возвращается при запуске внутреннего ЗЕЬЕСТ в одиночку:

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 
Смежные вопросы