Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Perbarui hasil pernyataan SELECT

Saya belum melihat nama resmi untuk ini. Referensi Oracle SQL hanya mengacu pada memperbarui subquery. Saya cenderung menganggapnya sebagai bentuk "pembaruan tampilan", dengan subquery berada dalam tampilan sebaris.

Ya, ini berfungsi ketika sejumlah tabel digabungkan, tetapi tunduk pada aturan pembaruan tampilan. Ini berarti bahwa hanya satu dari tabel dasar tampilan yang dapat diperbarui, dan tabel ini harus "dipertahankan kunci" dalam tampilan:yaitu barisnya hanya dapat muncul sekali dalam tampilan. Ini mengharuskan tabel lain dalam tampilan (subquery) direferensikan melalui batasan kunci asing pada tabel untuk diperbarui.

Beberapa contoh dapat membantu. Menggunakan tabel Oracle EMP dan DEPT standar, dengan EMP.EMPNO didefinisikan sebagai kunci utama EMP, dan EMP.DEPTNO didefinisikan sebagai kunci asing untuk DEPT.DEPTNO, maka pembaruan ini diperbolehkan:

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

Tapi ini bukan:

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

Adapun kinerja:pengoptimal akan (harus) mengidentifikasi tabel dasar yang akan diperbarui selama penguraian, dan penggabungan ke tabel lain akan diabaikan karena tidak ada kaitannya dengan pembaruan yang akan dilakukan - seperti yang ditunjukkan oleh keluaran AUTOTRACE ini:

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

(Perhatikan bahwa tabel DEPT tidak pernah diakses meskipun DEPT.DNAME muncul di subquery).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah Baku Panjang Oracle

  2. Dapatkan nilai berdasarkan maksimal kolom berbeda yang dikelompokkan berdasarkan kolom lain

  3. Kueri dinamis dengan HibernateCritera API &Oracle - kinerja

  4. Bagaimana cara menggunakan listagg dengan querydsl?

  5. Menggunakan pernyataan WITH dan UPDATE dalam kueri SQL yang sama