que funciones elementos ejemplos consultas avg agrupamiento agrupadas agrupacion agregado agregacion sql oracle view aggregate-functions

sql - funciones - ¿Por qué no puedo eliminar las filas de esta vista que tiene la función de agregado en la cláusula de selección(ORACLE)?



que es avg en sql (1)

Lo que está especificando es una vista no actualizable en Oracle. Las reglas que separan las vistas actualizables y no actualizables se especifican aquí a partir de la documentación de Oracle.

"Una vista no puede ser modificada por las instrucciones UPDATE, INSERT o DELETE si la consulta de vista contiene alguna de las siguientes construcciones:

A set operator A DISTINCT operator An aggregate or analytic function A GROUP BY, ORDER BY, MODEL, CONNECT BY, or START WITH clause A collection expression in a SELECT list A subquery in a SELECT list A subquery designated WITH READ ONLY Joins, with some exceptions, as documented in Oracle Database Administrator''s Guide"

enlace -> https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

Lo que desea puede ser y se soluciona mediante el uso de activadores Oracle INSTEAD OF.

Ya leí sobre las reglas para operaciones DML con vistas en ORACLE. La mayoría de ellos me parece clara, pero estoy confundido acerca de la función agregada.

Por ejemplo, tengo dos tablas.

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 ║ ║ ║ ╚═══════════╩═════════════╩══════════╝

Quiero una vista que muestre el salario promedio de un empleado por departamento. Entonces, ejecuto este SQL:

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;

Ahora tengo una vista que se ve así:

╔═══════════╦════════════╗ ║ dept_id ║ avg_salary ║ ╠═══════════╬════════════╣ ║ 10 ║ 2650 ║ ║ 20 ║ 4100 ║ ║ 30 ║ 1700 ║ ╚═══════════╩════════════╝

Entiendo por qué no puedo ejecutar declaraciones de actualización en contra de esta vista. La columna "avg_salary" no es un dato, es una información generada dinámicamente. ¿Pero por qué no puedo eliminar una fila de esta vista?

Si intento ejecutar:

delete from dept_sals where dept_id = 10;

Yo obtengo:

ORA-01732: data manipulation operation not legal on this view

Lo que estoy pensando:

La tabla base DEPARTAMENTOS tiene una relación de uno a uno con las filas en esta vista. Supongo que Oracle puede obtener {dept_id} de la vista y generar SQL que elimine la fila correspondiente de la tabla DEPARTMENTS. Esto no dañaría la consistencia de las tablas ya que la información en "avg_salary" no es un dato, es un cálculo que podemos descartar ya que el departamento con {dept_id} ya no existe.