[英]Oracle: Using CTE with update clause
我可以使用oracle数据库中的公用表表达式进行更新吗?
我收到错误ORA-00928: missing SELECT keyword
在尝试此操作时ORA-00928: missing SELECT keyword
:
with average as (SELECT avg(salary) FROM instructor)
update instructor
set salary = case
when salary <= average then salary * 1.05
else salary * 1.03
end
由于average salary
只是一个标量值,你可以做到
update instructor
set salary = case
when salary <= (select avg(t.salary) from instructor t) then salary * 1.05
else salary * 1.03
end
在这种情况下,Oracle首先计算平均值 (比如1234.4567
),然后执行更新 。
我可以在oracle数据库中做这样的事情吗?
好吧,这不是关于你能不能做到的。 这是关于你是否需要这样做。 在您的查询中,我没有看到任何筛选条件。 您想要更新所有行吗? 在你的情况下我不认为需要CTE 。
什么时候需要CTE ,即只要有子查询多次执行的场景,就用子句作为子查询因子分解方法。 使用WITH子句确保子查询执行一次,结果集存储为临时表。
是的,您可以使用WITH子句来获取UPDATE语句。
例如,
UPDATE TABLE t
SET t.column1, t.column2 = (SELECT column1, column2 FROM
(
WITH cte AS(
SELECT ... FROM another_table
)
SELECT * FROM cte
)
您可以使用MERGE语句使用 WITH子句。
例如,
SQL> MERGE INTO emp e USING
2 (WITH average AS
3 (SELECT deptno, AVG(sal) avg_sal FROM emp group by deptno)
4 SELECT * FROM average
5 ) u
6 ON (e.deptno = u.deptno)
7 WHEN MATCHED THEN
8 UPDATE SET e.sal =
9 CASE
10 WHEN e.sal <= u.avg_sal
11 THEN e.sal * 1.05
12 ELSE e.sal * 1.03
13 END
14 /
14 rows merged.
SQL>
基于密钥保留视图的相关更新的另一个答案 ,这里是另一个在Oracle SQL中使用CTE和更新的可能选项,避免重复where子句:
update (
with cte as (select avg(salary) average_salary from instructor)
select id, salary, cte.average_salary from instructor cross join cte
where <some_condition>
)
set salary = case
when salary <= average_salary/2 then salary * 1.1
when salary <= average_salary then salary * 1.05
else salary * 1.03
end
在自连接的情况下,这可以简化为无CTE版本:
update (
select id, salary, (select avg(salary) from instructor) average_salary
from instructor
where <some_condition>
)
set salary = case
when salary <= average_salary/2 then salary * 1.1
when salary <= average_salary then salary * 1.05
else salary * 1.03
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.