Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cập nhật kết quả của một câu lệnh SELECT

Tôi chưa thấy một cái tên chính thức cho cái này. Tham chiếu SQL của Oracle chỉ đề cập đến việc cập nhật một truy vấn con. Tôi có xu hướng coi đây là một dạng "cập nhật chế độ xem", với truy vấn con ở chế độ xem nội dòng.

Có, nó hoạt động khi một số bảng được kết hợp, nhưng tuân theo quy tắc cập nhật chế độ xem. Điều này có nghĩa là chỉ có thể cập nhật một trong các bảng cơ sở của chế độ xem và bảng này phải được "khóa" trong chế độ xem:tức là các hàng của nó chỉ có thể xuất hiện một lần trong chế độ xem. Điều này yêu cầu bất kỳ bảng nào khác trong dạng xem (truy vấn con) được tham chiếu qua các ràng buộc khóa ngoại trên bảng phải được cập nhật.

Một số ví dụ có thể hữu ích. Sử dụng bảng Oracle EMP và DEPT tiêu chuẩn, với EMP.EMPNO được định nghĩa là khóa chính của EMP và EMP.DEPTNO được định nghĩa là khóa ngoại cho DEPT.DEPTNO, thì bản cập nhật này được phép:

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

Nhưng đây không phải là:

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

Đối với hiệu suất:trình tối ưu hóa sẽ (phải) xác định bảng cơ sở sẽ được cập nhật trong quá trình phân tích cú pháp và các phép tham gia vào bảng khác sẽ bị bỏ qua vì chúng không có bất kỳ ảnh hưởng nào đến quá trình cập nhật sẽ được thực hiện - như đầu ra AUTOTRACE này hiển thị:

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

(Lưu ý rằng bảng DEPT không bao giờ được truy cập mặc dù DEPT.DNAME xuất hiện trong truy vấn con).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng Hàm LISTAGG của Oracle

  2. Số Dapper Oracle (10,0) được trả về dưới dạng lỗi Bộ phân tích cú pháp thập phân

  3. sql selectL hàng thành cột mà không có truy vấn con

  4. Ví dụ về Oracle WHILE LOOP

  5. thu nhỏ cơ sở dữ liệu trong oracle 11g