sql >> Databáze >  >> RDS >> Oracle

Aktualizujte výsledky příkazu SELECT

Neviděl jsem pro to formální název. Referenční příručka Oracle SQL pouze odkazuje na aktualizaci poddotazu. Mám tendenci to považovat za formu "aktualizace pohledu", přičemž dílčí dotaz je v in-line zobrazení.

Ano, funguje to, když je spojeno několik tabulek, ale podléhá aktualizaci pravidel zobrazení. To znamená, že lze aktualizovat pouze jednu ze základních tabulek pohledu a tato tabulka musí být v pohledu „zachována jako klíč“:tj. její řádky by se měly v pohledu zobrazit pouze jednou. To vyžaduje, aby se na všechny ostatní tabulky v pohledu (poddotazu) odkazovalo prostřednictvím omezení cizího klíče v tabulce, která má být aktualizována.

Některé příklady mohou pomoci. Pomocí standardních tabulek Oracle EMP a DEPT, kdy EMP.EMPNO je definován jako primární klíč EMP a EMP.DEPTNO je definován jako cizí klíč DEPT.DEPTNO, je tato aktualizace povolena:

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

Ale tohle není:

-- 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);

Pokud jde o výkon:optimalizátor (musí) identifikovat základní tabulku, která má být aktualizována během analýzy, a spojení s jinou tabulkou budou ignorována, protože nemají žádný vliv na aktualizaci, která má být provedena - jak ukazuje tento výstup AUTOTRACE:

Aktualizace
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")

(Všimněte si, že tabulka DEPT není nikdy přístupná, i když se v dílčím dotazu objeví DEPT.DNAME).



  1. Mysql Join 2 table a vyberte maximální a minimální hodnotu mezi časovým obdobím

  2. PHP a MySQL s Highchart

  3. Klíčové slovo SEPARATOR nefunguje správně ve vzorci Hibernate

  4. Kroky při implementaci hashtable v PHP a Mysql