2013-11-14 7 views
0

Я знаю, что этот вопрос задан довольно регулярно, но все же хотел бы знать, как это сделать.Обновление нескольких столбцов sql

Я пытаюсь обновить три значения, firstname, middlename, lastname из таблицы имен. Эмплид выбирается из промежуточного стола. Я хотел бы знать, как установить NVL для этого.

Блок запрос будет выглядеть следующим образом:

update staging_table 
set firstname, middlename,lastname = 
      (select firstname,middlename,last 
      from names 
      where names.emplid = staging_table.emplid) 

Я хочу, чтобы проверить нулевые значения, так как есть случаи, когда MiddleName равна нуль.

Часть вторая: У меня есть работа для этого на данный момент, но все же хотелось бы знать, как лучше техника влияет на производительность.

В настоящее время, я использовал это обновление запроса:

update staging_table set first_name = nvl((select first_name from names where emplid = staging_table.emplid),' ') 



update staging_table set middle_name = nvl((select middle_name from names where emplid = staging_table.emplid),' ') 

Есть ли лучший метод, чем это?

Я проверил для функции coalesce в оракуле, но проверяет весь результат, и если любой из параметров имеет значение null, только тогда возвращается значение null. Здесь мне нужно проверить нулевые значения для отдельных полей.

Спасибо за руководство.

ответ

2

Если есть middlameame, то есть null, то он будет обновлен до NULL в вашем промежуточном столе. Вы не проводите прямого сравнения NULL с другим значением, поэтому ничего не происходит.

Если вы изменили UPDATE к следующему, то вам, возможно, придется использовать NVL() или COALESCE() для того, чтобы обновить все:

update staging_table 
    set (firstname, middlename, lastname) 
     = (select firstname, middlename, last 
      from names 
      where names.emplid = staging_table.emplid 
       and names.middlename = staging_table.middlename 
       ) 

Вы, однако, не последнюю строку and names.middlename = staging_table.middlename , поэтому это не применяется.

Это может быть яснее, если вы сделали это как MERGE вместо:

merge into staging_table s 
using (select emplid, firstname, middlename, last 
      from names 
       ) n 
    on (s.emplid = n.emplid) 
when matched then 
     update 
     set s.firstname = n.firstname 
      , s.middlename = n.middlename 
      , s.lastname = n.last 

приписка, Don't use NVL(); у него много потенциальных ловушек, COALESCE() безопаснее.

+0

Спасибо за ответ, нет, я обновляя эту промежуточную таблицу, путем объединения с таблицей имен. Я не добавил данные для имен и других полей в таблице и хочу обновить их. Я попытался использовать nvl, но это не удалось. – vamosrafa

+0

Простите, я не понимаю @vamosrafa ... как то, что вы сделали, так и то, что я сказал, делать то, что вы хотите, и вам не нужно использовать NVL. – Ben

+1

Только один маленький бит информации. Когда вы намереваетесь использовать оператор 'merge', а версия oracle - 11.2.0.2, и в обновляемом столбце (-ах) есть ограничения проверки, они будут проигнорированы. Ошибка 9285259. –

0

Может быть, это может быть ответ:

update staging_table 
set (firstname, middlename,lastname) = 
    (select NVL(firstname , staging_table.firstname), 
      NVL(middlename, staging_table.middlename), 
      NVL(last  , staging_table.lastname) 
     from names 
     where names.emplid = staging_table.emplid) 
+0

Eliuhy: Теперь я обрабатываю отдельные поля, так как я помещаю этот оператор обновления в команду exec. Это решило мою проблему. Благодарю. – vamosrafa

Смежные вопросы