Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle :Utilisation de CTE avec la clause de mise à jour

Eh bien, il ne s'agit pas de savoir si vous pourriez le faire ou non. Il s'agit de savoir si vous devez le faire ou non. Dans votre requête, je ne vois aucun critère de filtre. Vous voulez mettre à jour toutes les lignes ? Je ne vois pas la nécessité de CTE dans votre cas.

Quand avez-vous besoin d'un CTE , c'est-à-dire une clause with comme méthode de factorisation de sous-requête chaque fois que vous avez un scénario dans lequel la sous-requête est exécutée plusieurs fois. Vous utilisez une clause WITH pour vous assurer que la sous-requête est exécutée une fois et que le jeu de résultats est stocké sous forme de table temporaire.

Oui, vous pouvez utiliser AVEC clause pour une UPDATE déclaration.

Par exemple,

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

Vous pouvez utiliser une MERGE déclaration USING le AVEC clause.

Par exemple,

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>