问题
我需要编写一个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。
答案 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' );