Как сохранить таблицу top5 sql, используя триггер? - PullRequest
0 голосов
/ 18 марта 2020

Я знаю, что представление гораздо лучше подходит для этой цели, но по какой-то причине безумные люди хотят, чтобы я использовал триггер.

В основном мне нужно вести таблицу из 5 лучших рейтингов, которая обновляется каждый раз. ресторан получает новый рейтинг. Я не знаю, как это сделать, поскольку мне кажется, что мне действительно нужно читать из таблицы, на которой у меня есть триггер, но Oracle не позволит мне.

drop view bestratings_rest;
create view bestratings_rest(rid, rat) as (select distinct rid, max(stars) from rating
group by rid);

drop table top5restaurants;
create table top5restaurants(rid int);

insert into top5restaurants(rid)
        select rid from top_rest
        where rownum <=5
        order by rat asc;



create or replace trigger top5_trigger
    after insert on rating
    for each row

    begin
    delete from top5restaurants;
    insert into top5restaurants
    select rid from top_rest
    where rownum <=5
    order by rat asc;
    end;
    /
--    
--
begin
update_reviews('Jade Court','Sarah M.', 4, '08/17/2017');
update_reviews('Shanghai Terrace','Cameron J.', 5, '08/17/2017');
update_reviews('Rangoli','Vivek T.',3,'09/17/2017');
update_reviews('Shanghai Inn','Audrey M.',2,'07/08/2017');
update_reviews('Cumin','Cameron J.', 2, '09/17/2017');
end;
/    
select * from top5restaurants;

1 Ответ

0 голосов
/ 18 марта 2020

Ваша команда INSERT для таблицы top5restaurants неверна. Это должно быть -

insert into top5restaurants(rid)
select *
from (select rid
      from top_rest
      order by rat asc)
where rownum <=5;

Поскольку Rownum будет выполняться первым, чем ордер, если вы go используете предыдущий подход.

Что касается вашего триггера, используя тот же запрос, что и выше, У вас может быть ниже код -

create or replace trigger top5_trigger
after insert on rating
for each row
begin
    delete from top5restaurants;

    insert into top5restaurants
    select *
    from (select rid
          from top_rest
          order by rat asc)
    where rownum <=5;
end;
/
...