Oracle:使用带有更新子句的 CTE

sha*_*rav 2 sql oracle common-table-expression

我可以使用oracle数据库中的公用表表达式进行更新吗?

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
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 5

我可以在 oracle 数据库中做这样的事情吗?

嗯,这不是你能不能做到。这是关于你是否需要这样做。在您的查询中,我没有看到任何过滤条件。你想更新所有的行吗?在您的情况下,我认为不需要CTE

何时需要CTE,即当您遇到多次执行子查询的场景时,将 with 子句作为子查询分解方法。您使用 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
                                        )
Run Code Online (Sandbox Code Playgroud)

你可以使用一个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>
Run Code Online (Sandbox Code Playgroud)