繁体   English   中英

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

[英]Oracle SQL - How do I update from an Outer Joined Table?

问题

我需要编写一个更新查询,其中我的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放在何处感到困惑。

如果我对您的理解正确,那么如果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表中存在匹配dw_sls_rep_conv ,则slsrep列将更新为所选值,否则为NULL

您是否考虑过在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' ); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM