Tôi đã đọc về các quy tắc cho các hoạt động DML với các khung nhìn trong ORACLE. Hầu hết trong số họ có vẻ rõ ràng với tôi, nhưng tôi đang nhầm lẫn về chức năng tổng hợp.Tại sao tôi không thể xóa các hàng từ khung nhìn này có hàm tổng hợp trong mệnh đề select (ORACLE)?
Ví dụ: tôi có hai bảng.
EMPLOYEES
╔═══════════╦═════════════╦══════════╗
║ emp_id ║ salary ║ dept_id ║
╠═══════════╬═════════════╬══════════╣
║ 2134 ║ 2200 ║ 10 ║
║ 2327 ║ 3100 ║ 10 ║
║ 2428 ║ 4100 ║ 20 ║
║ 2637 ║ 1700 ║ 30 ║
╚═══════════╩═════════════╩══════════╝
\ |/
\|/
|
| DEPARTMENTS
╔═══════════╦═════════════╦══════════╗
║ dept_id ║ dname ║ location ║
╠═══════════╬═════════════╬══════════╣
║ 10 ║ ║ ║
║ 20 ║ ║ ║
║ 30 ║ ║ ║
╚═══════════╩═════════════╩══════════╝
Tôi muốn có chế độ xem cho biết mức lương trung bình của nhân viên theo bộ phận. Vì vậy, tôi chạy SQL này:
CREATE OR REPLACE VIEW dept_sals AS
SELECT d.dept_id, round(avg(e.salary)) AS avg_salary
FROM employees e
JOIN
departments d
ON (e.dept_id = d.dept_id)
GROUP BY d.dept_id;
Bây giờ tôi có một cái nhìn trông giống như:
╔═══════════╦════════════╗
║ dept_id ║ avg_salary ║
╠═══════════╬════════════╣
║ 10 ║ 2650 ║
║ 20 ║ 4100 ║
║ 30 ║ 1700 ║
╚═══════════╩════════════╝
Tôi hiểu tại sao tôi không thể chạy cập nhật phát biểu chống lại quan điểm này. Cột "avg_salary" không phải là dữ liệu, nó là một thông tin được tạo động. Nhưng tại sao tôi không thể xóa một hàng từ chế độ xem này?
Nếu tôi cố gắng để chạy:
delete from dept_sals where dept_id = 10;
tôi nhận được:
ORA-01732: data manipulation operation not legal on this view
gì tôi đang nghĩ:
bảng cơ sở BỘ có một one-to-one mối quan hệ với hàng theo quan điểm này. Tôi đoán Oracle có thể nhận {dept_id} từ chế độ xem và tạo SQL xóa hàng tương ứng khỏi bảng DEPARTMENTS. Điều này sẽ không làm hỏng tính nhất quán của bảng vì thông tin trong "avg_salary" không phải là dữ liệu, đó là một phép tính mà chúng ta có thể vứt bỏ khi bộ phận có {dept_id} không còn tồn tại nữa.
Xóa khỏi chế độ xem đó sẽ xóa một cách hợp lý các hàng khỏi nhiều bảng hoặc chỉ một quan điểm theo ý kiến của bạn? Mặc dù đó không phải là câu trả lời vì nó sẽ bị cấm ngay cả đối với một truy vấn được nhóm bảng duy nhất . –
@ Martin Smith Tôi đang cố gắng tìm ra cách Oracle xem làm việc vì tôi không hiểu lý do xóa hạn chế trong tình huống này. Tôi đã thử nghiệm một trường hợp khi một khung nhìn với SQL = hai bảng tham gia, có cả hai khóa chính từ các bảng cơ sở trong các hàng của nó: một-một và một-nhiều. Tôi có thể xóa các hàng khỏi chế độ xem đó và chúng thực sự đã bị xóa khỏi bảng có quan hệ một-một. Bảng cơ sở có quan hệ một-nhiều với chế độ xem không bị ảnh hưởng với xóa. Tôi không thể hiểu tại sao Oracle không thể làm điều tương tự như ví dụ với avg. sals. Tôi nghĩ anh ta không cần bàn nhân viên để làm điều này. – Lynx
Theo quan điểm của tôi, Oracle đã không tính toán tất cả các tình huống có thể xảy ra (có rất nhiều tình huống có thể có trong các truy vấn xem) và chỉ cần đặt một số quy tắc cơ bản để tách riêng các khung nhìn có thể cập nhật và không thể cập nhật. thực hiện bất kỳ chế độ xem nào (nếu cần) có thể cập nhật. – ivanzg