Tôi đã không nhìn thấy một tên chính thức cho việc này. Oracle SQL Reference chỉ đề cập đến việc cập nhật truy vấn phụ. Tôi có xu hướng nghĩ về nó như một hình thức "xem cập nhật", với truy vấn con đang ở chế độ xem trực tuyến.
Có, nó hoạt động khi một số bàn được nối, nhưng phải tuân theo các quy tắc của chế độ xem đang được cập nhật. Điều này có nghĩa là chỉ một trong các bảng cơ sở của chế độ xem có thể được cập nhật và bảng này phải được "giữ nguyên khóa" trong chế độ xem: tức là các hàng của bảng chỉ có thể xuất hiện một lần trong chế độ xem. Điều này đòi hỏi rằng bất kỳ bảng nào khác trong khung nhìn (truy vấn phụ) được tham chiếu thông qua các ràng buộc khóa ngoài trên bảng được cập nhật.
Một số ví dụ có thể hữu ích. Sử dụng các 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, sau đó 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: optimizer sẽ (phải) xác định các bảng cơ sở phải được cập nhật trong thời gian phân tích, và tham gia vào bảng khác sẽ bị bỏ qua vì chúng không có bất kỳ vòng bi nào trên bản cập nhật được thực hiện - vì đầ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 appe ars trong truy vấn con).
Nguồn
2009-06-16 09:16:40
Có một ví dụ về bản cập nhật tham gia vào một SO khác: http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- oracle/975674 # 975674 - Về hiệu quả: nó có lẽ là cách hiệu quả nhất để cập nhật một tập hợp các hàng –
Nó thường được gọi là xem cập nhật. –