Oracle SQL - 如何从外部联接表更新?

时间:2013-11-14 18:08:51

标签: sql oracle sql-update outer-join

问题

我需要编写一个Update查询,其中我的SET引用了一个外连接表。

我可以使用SQL Server轻松地完成这项工作,但我很难想出Oracle中的语法,因为我只允许在更新查询中使用单个表。

我编写了以下Oracle查询:

UPDATE SalesExt_tmp tmp
SET slsrep = (SELECT three_dig_rep 
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
WHERE EXISTS (SELECT three_dig_rep
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
          AND tmp.sysind = 'AIM';

这会处理交集,但我需要处理SalesExt_tmp中dw_sls_rep_conv中没有等效匹配项的值(我计划添加一个case语句将空值设置为默认值)。为此,我需要将dw_sls_rep_conv设置为外连接表。但这就是我被卡住的地方。

SQL Server示例

在SQL Server中,解决方案是小菜一碟,因为您可以在更新查询中拥有多个表:

UPDATE SalesExt_tmp tmp 
LEFT JOIN dw_sls_rep_conv sls ON sls.aims_rep = tmp.slsrep 
SET tmp.slsrep = sls.three_dig_rep
WHERE tmp.sysind = 'AIM';

但我不能为我的生活弄清楚如何在Oracle中这样做。我知道这个查询将允许我的slsrep字段在某些情况下设置为NULL,这使我担心可能不允许此操作。

问题

1)首先,这可能在Oracle中实现吗? (它必须是,对吗?)

2)我如何重构我的查询以解决此问题?我猜我的WHERE EXISTS条款需要去......但是我仍然不知道在哪里放置我的JOIN。

2 个答案:

答案 0 :(得分:3)

如果我理解正确,如果dw_sls_rep_conv表中没有匹配项,您想将值设置为NULL吗?如果是这样,只需删除EXISTS条件,所有行都将更新:

UPDATE SalesExt_tmp tmp
SET slsrep = (SELECT three_dig_rep 
              FROM dw_sls_rep_conv sls
              WHERE sls.aims_rep = tmp.slsrep)
WHERE tmp.sysind = 'AIM';

如果dw_sls_rep_conv表格中存在匹配项,那么slsrep列将使用所选值进行更新,否则将使用NULL进行更新。

答案 1 :(得分:2)

您是否考虑在执行外部联接的where子句中使用子查询,如下所示:

UPDATE SalesExt_tmp tmp 
SET slsrep = (SELECT three_dig_rep 
FROM dw_sls_rep_conv sls WHERE sls.aims_rep = tmp.slsrep)      
WHERE 
 tmp.rowid in 
(SELECT tmp1.rowid 
 FROM SalesExt_tmp tmp1, 
      dw_sls_rep_conv sls 
 WHERE 
 tmp1.slsrep = sls.aims_rep (+) 
 AND tmp1.sysind = 'AIM' ); 
相关问题