es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualización de la calificación promedio en una nueva entrada de tabla con un desencadenador

Estoy tratando de calcular el nuevo promedio (en la tabla de películas) cada vez que se inserta una nueva tupla en la tabla de “watch”. He pensado en crear una nueva tabla dentro del disparador, creando un bucle for para contar el promedio, así como declarar una nueva variable de tabla, ninguna de las cuales funciona para mí.

Esto es lo que tengo actualmente

Crear O SUSTITUIR DISPARADOR nuevo_avg
PARA INSERTAR EN WATCH
DISPARADOR COMPUESTO
    avg_c   REAL;
    contador INTEGER :=0;
ANTES DE CADA FILA ES
COMENZAR

    SELECCIONAR AVG(clasificación) INTO avg_c FROM ??? WHERE : NEW.movie_ID = movie_ID;
FIN ANTES DE CADA FILA;
DESPUÉS DE CADA FILA ES 
COMENZAR
    ACTUALIZAR Película SET avg_rating = avg_c WHERE : NEW.movie_ID = movie_ID;
FIN DESPUÉS DE CADA FILA;

FIN;
/

¿Alguna idea de cómo hacer que funcione?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de resolver este problema y calcular el nuevo promedio cada vez que se inserta una nueva tupla en la tabla watch es mediante el siguiente disparador:

    CREATE OR REPLACE TRIGGER new_avg
    AFTER INSERT ON watch
    FOR EACH ROW
    DECLARE
        l_avg NUMBER;
    BEGIN
        SELECT AVG(rating)
        INTO l_avg
        FROM movie
        WHERE movie_id = :NEW.movie_id;
    
        UPDATE movie
        SET avg_rating = l_avg
        WHERE movie_id = :NEW.movie_id;
    END;
    /
    

    Este disparador se crea después de que ocurre una inserción en la tabla watch. Calcula la calificación promedio de la película asociada con la nueva tupla (usando AVG() y una declaración SELECT), y luego actualiza la fila correspondiente de la película con este nuevo promedio de calificación (usando una declaración UPDATE).

    Cabe destacar que no necesitamos crear una nueva tabla o utilizar un bucle for para calcular la calificación promedio, ya que SQL (y Oracle) tienen funciones de agregado potentes como AVG() que se pueden utilizar para realizar estos tipos de cálculos de manera eficiente.

    Además, no necesitamos un disparador compuesto (que puede ser más complejo de gestionar) para este problema, ya que solo necesitamos ejecutar algún código después de que se inserta cada fila en la tabla watch.

Comments are closed.