左联接更新声明

时间:2018-10-17 13:45:59

标签: sql oracle join sql-update

使用左连接的值对表进行更新很容易。 我想做这样的事情:

UPDATE tbl1 p
LEFT JOIN (
select column1 , column2 from tbl2
union
select column1,column2 from tbl3
) c on c.column2=p.column2
SET p.column1 =  nvl(c.column1, 'dummy');

5 个答案:

答案 0 :(得分:1)

UPDATE p SET p.column1 =  nvl(c.column1, 'dummy')
from tbl1 p
LEFT JOIN (
select column1 , column2 from tbl2
union
select column1,column2 from tbl3
) c on c.column2=p.column2

答案 1 :(得分:1)

我建议将此表示为:

UPDATE tbl1 p
    SET p.column1 =  COALESCE((SELECT column1 from tbl2 t2 WHERE t2.column2 = p.column2),
                              (SELECT column1 from tbl3 t3 WHERE t3.column2 = p.column2),
                              'dummy'
                             );

每个子查询都可以使用索引,因此它也应具有更好的性能。

答案 2 :(得分:0)

尝试看看下面的代码是否能使CTE发挥作用

Update tbl1 p
set column1 =  nvl((with CTE as 
(select column1 , column2 from tbl2
union
select column1,column2 from tbl3) select column1 from CTE where CTE.column2= p.column2  ),'dummy');

答案 3 :(得分:0)

使用merge

merge into tbl1 tgt
using (select min(column1) column1, column2
         from (select column1, column2 from tbl2 union all
               select column1, column2 from tbl3)
         group by column2) src
on (tgt.column2 = src.column2)
when matched then update set tgt.column1 = src.column1

假设您有以下表格:

create table tbl1(column1, column2) as (
    select 0, 'A' from dual union all
    select 0, 'B' from dual union all
    select 0, 'C' from dual union all
    select 0, 'D' from dual );

create table tbl2(column1, column2) as (
    select  1, 'A' from dual union all
    select 41, 'D' from dual );  

create table tbl3(column1, column2) as (
    select  2, 'B' from dual union all
    select 42, 'D' from dual );  

我们在{{1}中具有键A的值,在tbl2中具有B的值,在两个源表中都没有tbl3的值,我们键C有两个有问题的值。您必须决定在最后一种情况下该做什么,对字符串使用Dmin()avg()之类的任何聚合函数。如果这种情况是不可能的,那么您可以简化我的声明,将源子查询替换为简单的并集。

您还可以使用listagg(),但是在这种情况下,您必须添加update子句并检查键的存在,以避免使值无效,这会使代码更长。

where的结果

merge:

答案 4 :(得分:0)

如果可以在“匹配时”和“未匹配时”中更新相同的字段,那么合并语句可能是完美的解决方案。无论如何,我这样修复它: 使用过程从外部表填充表。 将过程插入语句中的所有记录的字段设置为“虚拟”,并且在工作后按预期使用MERGE WHEN MATCHED

PS:我无法像@OndřejCrha所说的那样工作。