Oracle SQL 更新集

Posted

技术标签:

【中文标题】Oracle SQL 更新集【英文标题】:Oracle SQL Update set 【发布时间】:2014-02-11 16:28:27 【问题描述】:

我正在尝试根据同一个表中与另一个表匹配的列更新计数 (+1) 的列,我在下面尝试过:

UPDATE table1 p
   SET (p.f_dup_count)= ((p.f_dup_count) + 1)
      WHERE (SELECT a.f, 
                    p.f
               FROM table2 a,
                    table1 p
              WHERE a.f = p.f
                AND a.a_id = p.a_id)

这目前导致:

Error at Command Line:28 Column:40 Error report: SQL Error: ORA-00936: missing expression 00936. 00000 -  "missing expression"
*Cause:    
*Action:

为此提供了一个非常有用的解决方案,如下所示:

更新表1 p SET f_dup_count =(存在时的情况(SELECT 1 从表 2 中 其中 a.f = p.f 和 a.a_id = p.a_id ) 然后 f_dup_count + 1 否则 0 结束);

但是,现在我已经对其进行了测试,我发现处理时间非常高。我有办法将其作为“创建表作为选择”来提高性能吗?

谢谢,

亚当

【问题讨论】:

where 子句需要是 'where field/condition = field/condition'...这里的语句缺少 =...其中概述的 select 语句 = what(或哪个字段在table1 等于子查询中的字段)。如果你分享你想要完成的事情,我相信我们可以为你重写。旁注...最好不要将计数单独存储在数据库中...最好有一个动态运行增量计数的语句。 我猜你想要“EXITS”谓词,但是错误信息很清楚,很容易通过错误代码找到答案 【参考方案1】:

我猜重点是在table2找到对应记录时更新dup count。

如果是这样,您需要将子查询更改为相关子查询,方法是删除其中对 table1 的引用。然后,我猜您想检查table2 中是否存在相应的记录,您可以使用exists

UPDATE table1 p
     SET f_dup_count = f_dup_count + 1
     WHERE exists (SELECT 1
                   FROM table2 a
                   WHERE a.f = p.f AND
                         a.a_id = p.a_id
                  );

编辑:

如果您想递增或设置为 1,则可以使用两次更新或将条件移动到 case 语句中:

UPDATE table1 p
     SET f_dup_count = (case when exists (SELECT 1
                                          FROM table2 a
                                          WHERE a.f = p.f AND
                                                a.a_id = p.a_id
                                         )
                             then f_dup_count + 1
                             else 0
                         end);

【讨论】:

是否可以在这条语句中添加 ELSE SET f_dup_count = 0? 太棒了!再次感谢!【参考方案2】:

where 子句应包含类似where ID = 42 的条件。你的只有一个值,比如where 42。 Oracle 不知道如何处理该值。

在 Oracle 中解决问题的一种方法是子查询更新,例如:

UPDATE  (
        SELECT p.f_dup_count
        FROM   table2 a
        JOIN   table1 p
        ON     a.f = p.f
               AND a.a_id = p.a_id
        ) SubQueryAlias
SET     f_dup_count = f_dup_count + 1

【讨论】:

以上是关于Oracle SQL 更新集的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:根据结果集计数更新行

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。

Oracle 和 SQL 数据集

Oracle PL/SQL 在循环中捕获锁定异常并继续

sql [Oracle] Crear程序retornando记录集

SQL常用指令集(Oracle)