如何使用触发器维护top5 sql表?
我知道一个视图更适合这个目的,但出于某种原因,头脑简单的人希望我使用触发器 基本上,我需要维护一个前5名的评级表,每当一家餐厅获得新的评级时,该表都会更新。我不知道该怎么做,因为看起来我实际上需要从表中读取触发器,但Oracle不会让我这样做如何使用触发器维护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)
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抛出了一个错误。具体化视图会产生新的错误。