2

问题

我需要编写一个更新查询,其中我的 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。

4

2 回答 2

3

如果我理解正确,如果表中没有匹配项,您想将值设置为 NULLdw_sls_rep_conv吗?如果是这样,只需删除您的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.

于 2013-11-14T18:14:18.220 回答
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' ); 
于 2013-11-14T18:36:28.787 回答