Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:utilizzo di CTE con clausola di aggiornamento

Bene, non si tratta di farlo o meno. Si tratta di farlo o meno. Nella tua query non vedo alcun criterio di filtro. Vuoi aggiornare tutte le righe? Non vedo la necessità di CTE nel tuo caso.

Quando hai bisogno di un CTE , ovvero una clausola with come metodo di factoring della sottoquery ogni volta che si dispone di uno scenario in cui la sottoquery viene eseguita più volte. Utilizzi una clausola WITH per assicurarti che la sottoquery venga eseguita una volta e che il set di risultati venga archiviato come tabella temporanea.

Sì, puoi usare CON clausola per un UPDATE dichiarazione.

Ad esempio,

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

Potresti usare un MERGE dichiarazione UTILIZZO il CON clausola.

Ad esempio,

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>