[英]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.