Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:Usando CTE com cláusula de atualização


Bem, não é sobre se você poderia fazer isso ou não. É sobre se você precisa fazer isso ou não. Na sua consulta, não vejo nenhum critério de filtro. Deseja atualizar todas as linhas? Não vejo necessidade de CTE no seu caso.

Quando você precisa de um CTE , ou seja, uma cláusula with como um método de fatoração de subconsulta sempre que você tiver um cenário em que a subconsulta seja executada várias vezes. Você usa uma cláusula WITH para garantir que a subconsulta seja executada uma vez e que o conjunto de resultados seja armazenado como uma tabela temporária.

Sim, você pode usar COM cláusula para um UPDATE declaração.

Por exemplo,
UPDATE TABLE t
SET t.column1, t.column2 = (SELECT column1, column2 FROM 
                                       (
                                        WITH cte AS(
                                   SELECT ... FROM another_table
                                                 )
                                         SELECT * FROM cte
                                        )

Você pode usar um MERGE declaração USANDO o COM cláusula.

Por exemplo,
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>