sql >> Databasteknik >  >> RDS >> Oracle

Oracle:Använder CTE med uppdateringsklausul

Tja, det handlar inte om huruvida du skulle kunna göra det eller inte. Det handlar om huruvida du behöver göra det eller inte. I din fråga ser jag inga filterkriterier. Vill du uppdatera alla rader? Jag ser inget behov av CTE i ditt fall.

När behöver du en CTE , d.v.s. en med-sats som en sub-query factoring-metod när du har ett scenario där sub-query exekveras flera gånger. Du använder en WITH-sats för att se till att underfrågan körs en gång och att resultatuppsättningen lagras som en tillfällig tabell.

Ja, du kan använda WITH klausul för en UPPDATERING påstående.

Till exempel,

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

Du kan använda en MERGE uttalande ANVÄNDER Med klausul.

Till exempel,

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>


  1. MySQL-fråga för att räkna objekt per vecka under de nuvarande 52 veckorna?

  2. Procedur med IN-parameter

  3. COALESCE() Funktion i Oracle

  4. MYSQL LEFT JOIN MED GROUP BY