Cú pháp của câu lệnh UPDATE là:
http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm
nơi dml_table_expression_clause
là:
Hãy chú ý đến ( subquery )
một phần của cú pháp trên.
subquery
là một tính năng cho phép thực hiện cập nhật các phép nối.
Ở dạng đơn giản nhất, nó có thể là:
UPDATE (
subquery-with-a-join
)
SET cola=colb
Trước khi cập nhật tham gia, bạn phải biết các hạn chế được liệt kê tại đây:
https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm
- Một toán tử tập hợp
- Toán tử DISTINCT
- Một hàm tổng hợp hoặc phân tích
- Mệnh đề GROUP BY, ORDER BY, MODEL, CONNECT BY hoặc START WITH
- Một biểu thức tập hợp trong danh sách CHỌN
- Một truy vấn con trong danh sách CHỌN
- Một truy vấn con được chỉ định CHỈ CÓ ĐỌC
- Tham gia, với một số ngoại lệ, như được ghi trong Hướng dẫn của Quản trị viên Cơ sở dữ liệu Oracle
và các quy tắc chung liên quan đến các chế độ xem có thể cập nhật - tại đây (phần:Updating a Join View
):
http:// docs .oracle.com / cd / B19306_01 / server.102 / b14231 / views.htm # sthref3055
Trước tiên, chúng ta có thể tạo một truy vấn con với một phép nối:
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
Truy vấn này chỉ trả về kết quả sau:
AGE
----------
30
và bây giờ chúng tôi có thể thử cập nhật truy vấn của mình:
UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;
nhưng chúng tôi gặp lỗi:
Lỗi này có nghĩa là một trong những hạn chế ở trên không được đáp ứng (bảng được lưu giữ khóa).
Tuy nhiên, nếu chúng tôi thêm khóa chính vào bảng của mình:
alter table names add primary key( id );
alter table ages add primary key( id );
thì bây giờ bản cập nhật hoạt động mà không có bất kỳ lỗi nào và kết quả cuối cùng là:
select * from ages;
ID AGE
---------- ----------
1 25
2 31
3 35