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 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。