Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用触发器维护top5 sql表?_Sql_Oracle_Database Trigger - Fatal编程技术网

如何使用触发器维护top5 sql表?

如何使用触发器维护top5 sql表?,sql,oracle,database-trigger,Sql,Oracle,Database Trigger,我知道一个视图更适合这个目的,但出于某种原因,头脑简单的人希望我使用触发器 基本上,我需要维护一个前5名的评级表,每当一家餐厅获得新的评级时,该表都会更新。我不知道该怎么做,因为看起来我实际上需要从表中读取触发器,但Oracle不会让我这样做 drop view bestratings_rest; create view bestratings_rest(rid, rat) as (select distinct rid, max(stars) from rating group by rid)

我知道一个视图更适合这个目的,但出于某种原因,头脑简单的人希望我使用触发器

基本上,我需要维护一个前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;

您对top5restaurants表的INSERT命令不正确。这一定是-

insert into top5restaurants(rid)
select *
from (select rid
      from top_rest
      order by rat asc)
where rownum <=5;
因为若使用上一种方法,Rownum将比order先执行

就触发器而言,使用与上面相同的查询,您可能有以下代码-

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;
/

插入相对容易处理,因为您可以检查插入的行是否属于前5行,并在必要时在前5行中留出空间。更新和删除问题更大,因为可能需要从原始表中找到新行。你也必须处理这些问题吗?还有,应该如何处理关系?你可能有一个平局,在你的样本数据中,我猜裸整数是评级,但只有五行可能;不清楚五排以上的第五名的平局会发生什么。平局可以任意处理。是的,int是评级。是的,事实上,现在我正在讨论它,我意识到插入实际上是我唯一需要担心的事情,我不必做更新或删除。所以我应该能够使用bestratings表来访问评级。我认为这不起作用,因为top_rest实际上应该是bestratings_rest仍然访问ratings表,所以oracle抛出了一个错误。具体化视图会产生新的错误。