sql >> Databasteknik >  >> RDS >> Oracle

Uppdatera resultaten av en SELECT-sats

Jag har inte sett något formellt namn för detta. Oracle SQL Reference hänvisar bara till att uppdatera en underfråga. Jag tenderar att tänka på det som en form av "vyuppdatering", med underfrågan i in-line-vy.

Ja, det fungerar när ett antal tabeller är sammanfogade, men med förbehåll för reglerna för uppdatering av syn. Detta innebär att endast en av vyns bastabeller kan uppdateras, och denna tabell måste "nyckelbevaras" i vyn:d.v.s. dess rader ska bara kunna visas en gång i vyn. Detta kräver att alla andra tabeller i vyn (underfrågan) refereras via främmande nyckelbegränsningar på tabellen som ska uppdateras.

Några exempel kan hjälpa. Genom att använda standardtabellerna för Oracle EMP och DEPT, där EMP.EMPNO definieras som primärnyckeln för EMP, och EMP.DEPTNO definieras som en främmande nyckel för DEPT.DEPTNO, är denna uppdatering tillåten:

update (select emp.empno, emp.ename, emp.sal, dept.dname
        from   emp join dept on dept.deptno = emp.deptno
       )
set sal = sal+100;

Men det här är inte:

-- DEPT is not "key-preserved" - same DEPT row may appear
-- several times in view
update (select emp.ename, emp.sal, dept.deptno, dept.dname
        from   emp join dept on dept.deptno = emp.deptno
       )
set dname = upper(dname);

När det gäller prestanda:optimeraren kommer (måste) identifiera bastabellen som ska uppdateras under analysen, och kopplingar till andra tabeller kommer att ignoreras eftersom de inte har någon betydelse för uppdateringen som ska utföras - som denna AUTOTRACE-utdata visar:

SQL> update (select emp.ename, emp.sal, dept.dname
  2              from   emp join dept on dept.deptno = emp.deptno
  3             )
  4      set sal = sal-1;

33 rows updated.


Execution Plan
----------------------------------------------------------
Plan hash value: 1507993178

------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT    |              |    33 |   495 |     3   (0)| 00:00:01 |
|   1 |  UPDATE             | EMP          |       |       |            |          |
|   2 |   NESTED LOOPS      |              |    33 |   495 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMP          |    33 |   396 |     3   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN| SYS_C0010666 |     1 |     3 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

(Observera att tabellen DEPT aldrig nås även om DEPT.DNAME visas i underfrågan).



  1. MySQL - Åtkomst nekad för användare

  2. 2 sätt att lista alla tabellvärderade funktioner i en SQL Server-databas

  3. SQL-fråga att gruppera efter dag

  4. SQL-fråga 6 grader av separation för nätverksanalys