【问题标题】:Oracle SQL - How do I update from an Outer Joined Table?Oracle SQL - 如何从外部联接表更新?
【发布时间】:2013-11-14 18:08:50
【问题描述】:

问题

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

【问题讨论】:

    标签: sql oracle sql-update outer-join


    【解决方案1】:

    如果我理解正确,如果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

    【讨论】:

    • 哇哦....太简单了!这正是我想做的……谢谢!我仍在努力思考 SQL Server 和 Oracle 更新查询之间的逻辑差异。但是我现在知道它是如何工作的......我的 WHERE 条件设置了要更新的内容,而我的 SET 定义了要更新到的值。两者之间的任何差异都将设置为 null。
    【解决方案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' ); 
    

    【讨论】:

    • 谢谢,我在发布后不久就开始探索这条道路,虽然效率不高,但它肯定也能奏效。欣赏这篇文章!
    猜你喜欢
    • 2014-06-09
    • 2012-10-04
    • 1970-01-01
    • 2011-04-12
    • 2016-10-21
    • 1970-01-01
    • 2020-07-15
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多