更新多列sql

时间:2013-11-14 08:32:57

标签: sql oracle oracle11g

我知道这是一个经常提出的问题,但仍然想知道如何去做。

我正在尝试更新名称表中的三个值,firstname,middlename,lastname。从登台表中选择emplid。我想知道如何为此设置NVL。

查询块将如下所示:

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

我想检查空值,因为有些情况是middlename为null。

第二部分:到目前为止,我已经解决了这个问题,但是,当性能受到影响时,我想知道更好的技术。

截至目前,我已使用此更新查询:

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),' ')

有没有比这更好的技术?

我在oracle中检查了coalesce函数,但检查了整个结果,如果任何一个参数为null,则只返回null值。在这里,我需要检查各个字段的空值。

感谢您的指导。

2 个答案:

答案 0 :(得分:3)

如果中间名为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

P.S。,Don't use NVL();它有很多潜在的陷阱,COALESCE()更安全。

答案 1 :(得分: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)