Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle:Verwenden von CTE mit Aktualisierungsklausel

Nun, es geht nicht darum, ob Sie es tun könnten oder nicht. Es geht darum, ob Sie es tun müssen oder nicht. In Ihrer Abfrage sehe ich keine Filterkriterien. Sie möchten alle Zeilen aktualisieren? Ich sehe keine Notwendigkeit für CTE in Ihrem Fall.

Wann brauchen Sie einen CTE , d. h. eine with-Klausel als Faktorisierungsmethode für Unterabfragen, wenn Sie ein Szenario haben, in dem die Unterabfrage mehrmals ausgeführt wird. Sie verwenden eine WITH-Klausel, um sicherzustellen, dass die Unterabfrage einmal ausgeführt und die Ergebnismenge als temporäre Tabelle gespeichert wird.

Ja, Sie könnten WITH verwenden Klausel für ein UPDATE Aussage.

Zum Beispiel

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

Sie könnten ein MERGE verwenden Anweisung USING das MIT Klausel.

Zum Beispiel

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>